题意:首先T组数据,每组数据包括:第一行:一个n,m,然后下面有一个n行m列的01矩阵。

   最后一行输入四个数字,分别是起点的横纵坐标,终点的横纵坐标。询问从起点到终点,最少要几步,如果到不了输出-1

     题目给定要求:1、不能停在原地 2、如果当前点是0,那么只能走上下,如果当前点是1,只能走左右。3、每走一次,整个01矩阵反过来(0变成1,1变成0这样)

思路:注意到走2次就会变回原来的图,那么只需要分情况进行广搜即可,即:记录下当前点步数然后余2,就知道当前点是0还是1。然后再根据01的走动规则来入队列。

     其次就是n和m很大,可以拿vector套vector存,也可以跟我一样拿map套pair存。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
map<pair<int,int>,int>ma;
map<pair<int,int>,int>vis;
int n,m;
struct note{
int x,y;
LL step;
}p,pos;
bool judge(int x,int y){
if(vis[make_pair(x,y)] == || x< || x>=n || y< || y>=m)
return false;
return true;
}//判断是否越界以及走过
int go[][]={{,-},{,},{,},{-,}};
LL bfs(int sx,int sy,int ex,int ey){
queue<note>q;
p.x = sx;
p.y = sy;
p.step = ;
q.push(p);
vis[make_pair(sx,sy)] = ;
while(!q.empty()){
pos = q.front();
q.pop();
//printf("ca %d %d %d\n",pos.x,pos.y,pos.step);
if(pos.x == ex && pos.y == ey) return pos.step;
int now = pos.step % ;//是否是原来的图
if(now == ){
if(ma[make_pair(pos.x,pos.y)] == ){
for(int i = ; i < ;i ++){
int dx = pos.x + go[i][];
int dy = pos.y + go[i][];
if(judge(dx,dy)){
vis[make_pair(dx,dy)] = ;
p.x = dx;
p.y = dy;
p.step = pos.step + ;
if(dx== ex && dy== ey)return p.step;
q.push(p);
}
}
}//如果当前是0
else{
for(int i = ; i < ;i ++){
int dx = pos.x + go[i][];
int dy = pos.y + go[i][];
if(judge(dx,dy)){
vis[make_pair(dx,dy)] = ;
p.x = dx;
p.y = dy;
p.step = pos.step + ;
if(dx== ex && dy== ey)return p.step;
q.push(p);
}
}
}
}
else if(now == ){
if(ma[make_pair(pos.x,pos.y)] == ){
for(int i = ; i < ;i ++){
int dx = pos.x + go[i][];
int dy = pos.y + go[i][];
if(judge(dx,dy)){
vis[make_pair(dx,dy)] = ;
p.x = dx;
p.y = dy;
p.step = pos.step + ;
if(dx== ex && dy== ey)return p.step;
q.push(p);
}
}
}//如果当前是1
else{
for(int i = ; i < ;i ++){
int dx = pos.x + go[i][];
int dy = pos.y + go[i][];
if(judge(dx,dy)){
vis[make_pair(dx,dy)] = ;
p.x = dx;
p.y = dy;
p.step = pos.step + ;
if(dx== ex && dy== ey) return p.step;
q.push(p);
}
}
}
}
}
return -*1LL;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
int sx,sy,ex,ey;
scanf("%d %d",&n,&m);
for(int i = ; i < n ; i++){
for(int j = ; j < m ; j++){
int x;
scanf("%d",&x);
pair<int,int>pii = make_pair(i,j);
ma[pii] = x;
vis[pii] = ;
}
}
scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
sx-=;sy-=;ex-=;ey-=;
printf("%d\n",bfs(sx,sy,ex,ey));
}
return ;
}

ZOJ2018/4月月赛G题Traffic Light(广搜)的更多相关文章

  1. csu 10月 月赛 H 题 A Very Hard Problem

    Description CX老湿经常被人黑,被黑得多了,自己也就麻木了.于是经常听到有人黑他,他都会深情地说一句:禽兽啊! 一天CX老湿突发奇想,给大家出了一个难题,并且声称谁能够准确地回答出问题才能 ...

  2. csu 10月 月赛 I 题 The Contest

    Description 殷犇有很多队员.他们都认为自己是最强的,于是,一场比赛开始了~ 于是安叔主办了一场比赛,比赛有n个题目,每个题目都有一个价值Pi和相对能力消耗Wi,但是有些题目因为太坑不能同时 ...

  3. csu 10月 月赛 D 题 CX and girls

    Description CX是要赶去上课,为了不迟到必须要以最短的路径到达教室,同时CX希望经过的路上能看到的学妹越多越好.现在把地图抽象成一个无向图,CX从1点出发,教室在N号点,告诉每个点上学妹的 ...

  4. csu 10月 月赛 F 题 ZZY and his little friends

    一道字典树异或的题,但是数据比较水,被大家用暴力给干掉了! 以前写过一个类似的题,叫做the longest xor in tree: 两个差不多吧! 好久没写字典树了,复习一下! 代码: #incl ...

  5. csu 10月 月赛 B 题 Scoop water

    一个卡特兰数的应用: 卡特兰数主要有以下几个用途: 1.不同的出栈入栈数: 2.n个点组成的不同的二叉树的数目: 3.凸多边形的三角剖分划分: 4.括号化问题: 通项公式是:h(n) = C(2n-2 ...

  6. csu 10月 月赛 J 题

    Description CSU又到了一年中评奖学金的时候了……各大学霸都或多或少地拿到了各种奖学金(你们自己看着办吧). 在这里,评奖学金有个很奇怪的规矩——每个同学得到的奖学金数一定满足相邻的两个非 ...

  7. CSU 2018年12月月赛 G(2219): Coin

    Description 有这样一个众所周知的问题: 你面前有7个硬币,其中有一个劣质的(它比正常的硬币轻一点点),你有一个天平,问需要你需要使用天平多少次能保证找到那个劣质的硬币. 众所周知的算法是: ...

  8. Contest2037 - CSU Monthly 2013 Oct(中南大学2013年10月月赛水题部分题解)

    Problem A: Small change 题解:http://www.cnblogs.com/crazyapple/p/3349469.html Problem B: Scoop water 题 ...

  9. csu 10月 月赛 A 题

    Welcome to CSU OnlineJudge Problem A: Small change Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 15 ...

随机推荐

  1. spring data jpa update

    一:在controller  加上: @Controller @RequestMapping("/user") public class UserController { @Aut ...

  2. kubernetes发布tomcat服务,通过deployment,service布署

    1.制作tomcat镜像 参考docker tomcat镜像制作 此处直接拉取 查看已有可镜像 先设置docker阿里源,即添加 "registry-mirrors": [&quo ...

  3. 解决Run As -> Java Application不能运行问题

    转自:https://breakshell.iteye.com/blog/467130 点 Run As -> Java Application 不能运行,报的错误如下: Plug-in org ...

  4. charles抓包的安装,使用说明以及常见问题解决(windows)

    charles抓包的安装,使用说明以及常见问题解决(windows) https://blog.csdn.net/zhangxiang_1102/article/details/77855548

  5. SVM视频跟踪

    # -*- coding: utf-8 -*- """ Created on Thu Nov 8 21:44:12 2018 @author: xg "&quo ...

  6. python day10 数据库(mysql基础)

    一.数据库的概念 数据:事物的特征 数据库的本质是:通过套接字进行通信,来读存数据的一种软件,由于每次开发人员写程序都得写数据的套接字,所以诞生了数据库这个软件,减少重复劳动.(sql语句通用) 数据 ...

  7. iOS app bundle id

    每个app的bundle id是唯一的,不同开发者账号不能申请相同的bundle id,例如开发者账号B想用开发者A的bundle id,只能是开发者A将这个bundle id先删除,B才可以注册,否 ...

  8. C++复习:异常

    异常处理机制专题 前言 1)异常是一种程序控制机制,与函数机制独立和互补     函数是一种以栈结构展开的上下函数衔接的程序控制系统,异常是另一种控制结构,它依附于栈结构,却可以同时设置多个异常类型作 ...

  9. Excel VBA 使用笔记

    开发工具选项卡(Developer Tab) File Tab -> Options -> Customize Ribbon -> Main Tabs -> Developer ...

  10. 在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件。

    原因:在新安装的Linux系统中,防火墙默认是被禁掉的,一般也没有配置过任何防火墙的策略,所有不存在/etc/sysconfig/iptables文件. 解决办法: .随便写一条iptables命令配 ...