题意:首先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存。

代码:

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. map<pair<int,int>,int>ma;
  5. map<pair<int,int>,int>vis;
  6. int n,m;
  7. struct note{
  8. int x,y;
  9. LL step;
  10. }p,pos;
  11. bool judge(int x,int y){
  12. if(vis[make_pair(x,y)] == || x< || x>=n || y< || y>=m)
  13. return false;
  14. return true;
  15. }//判断是否越界以及走过
  16. int go[][]={{,-},{,},{,},{-,}};
  17. LL bfs(int sx,int sy,int ex,int ey){
  18. queue<note>q;
  19. p.x = sx;
  20. p.y = sy;
  21. p.step = ;
  22. q.push(p);
  23. vis[make_pair(sx,sy)] = ;
  24. while(!q.empty()){
  25. pos = q.front();
  26. q.pop();
  27. //printf("ca %d %d %d\n",pos.x,pos.y,pos.step);
  28. if(pos.x == ex && pos.y == ey) return pos.step;
  29. int now = pos.step % ;//是否是原来的图
  30. if(now == ){
  31. if(ma[make_pair(pos.x,pos.y)] == ){
  32. for(int i = ; i < ;i ++){
  33. int dx = pos.x + go[i][];
  34. int dy = pos.y + go[i][];
  35. if(judge(dx,dy)){
  36. vis[make_pair(dx,dy)] = ;
  37. p.x = dx;
  38. p.y = dy;
  39. p.step = pos.step + ;
  40. if(dx== ex && dy== ey)return p.step;
  41. q.push(p);
  42. }
  43. }
  44. }//如果当前是0
  45. else{
  46. for(int i = ; i < ;i ++){
  47. int dx = pos.x + go[i][];
  48. int dy = pos.y + go[i][];
  49. if(judge(dx,dy)){
  50. vis[make_pair(dx,dy)] = ;
  51. p.x = dx;
  52. p.y = dy;
  53. p.step = pos.step + ;
  54. if(dx== ex && dy== ey)return p.step;
  55. q.push(p);
  56. }
  57. }
  58. }
  59. }
  60. else if(now == ){
  61. if(ma[make_pair(pos.x,pos.y)] == ){
  62. for(int i = ; i < ;i ++){
  63. int dx = pos.x + go[i][];
  64. int dy = pos.y + go[i][];
  65. if(judge(dx,dy)){
  66. vis[make_pair(dx,dy)] = ;
  67. p.x = dx;
  68. p.y = dy;
  69. p.step = pos.step + ;
  70. if(dx== ex && dy== ey)return p.step;
  71. q.push(p);
  72. }
  73. }
  74. }//如果当前是1
  75. else{
  76. for(int i = ; i < ;i ++){
  77. int dx = pos.x + go[i][];
  78. int dy = pos.y + go[i][];
  79. if(judge(dx,dy)){
  80. vis[make_pair(dx,dy)] = ;
  81. p.x = dx;
  82. p.y = dy;
  83. p.step = pos.step + ;
  84. if(dx== ex && dy== ey) return p.step;
  85. q.push(p);
  86. }
  87. }
  88. }
  89. }
  90. }
  91. return -*1LL;
  92. }
  93. int main(){
  94. int t;
  95. scanf("%d",&t);
  96. while(t--){
  97. int sx,sy,ex,ey;
  98. scanf("%d %d",&n,&m);
  99. for(int i = ; i < n ; i++){
  100. for(int j = ; j < m ; j++){
  101. int x;
  102. scanf("%d",&x);
  103. pair<int,int>pii = make_pair(i,j);
  104. ma[pii] = x;
  105. vis[pii] = ;
  106. }
  107. }
  108. scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
  109. sx-=;sy-=;ex-=;ey-=;
  110. printf("%d\n",bfs(sx,sy,ex,ey));
  111. }
  112. return ;
  113. }

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. 使用STM32的USART的同步模式Synchronous调戏SPI[2] 【实现spi 9bit】

    [原创出品§转载请注明出处] 出处:http://www.cnblogs.com/libra13179/p/7064533.html 上回说道使用USART的来模拟SPI通讯.说说一下我什么写这个的原 ...

  2. eclipse中无法新建Android工程 出现问题:Plug-in org.eclipse.ajdt.ui was unable to load

    转自:http://www.bubuko.com/infodetail-757338.html eclipse中打开后新建Android项目区仍无法创建,出现下列提示对话框: Plug-in org. ...

  3. C++中map用法详解《转》

    Map是c++的一个标准容器,她提供了很好一对一的关系,在一些程序中建立一个map可以起到事半功倍的效果,总结了一些map基本简单实用的操作! . map最基本的构造函数: map<string ...

  4. 各种Queue分析

    Queue主要方法的区别:   抛出异常 返回特殊值 插入 add(e)插入成功则返回true,没有可用空间则IllegalStateException offer(e) 移除 remove(e)获取 ...

  5. css 的pointer-events 属性

    1.css 有好多属性,可以让你感觉到不可思议,关键是可以解决一些难以实现的问题,今天遇到一个,就是 point-enevts属性 支持 pointer-events 属性 的浏览器版本 2. 1  ...

  6. linux 2.6.32文件系统 fd与file*之间的关系

    给定如下一定情况: crash> files PID: TASK: ffff8817facd2100 CPU: COMMAND: "slabtop" ROOT: / CWD: ...

  7. E_FAIL (0x80004005) MachineWrap

    下载VirtualBox-4.3.12-93733-Win.exe,下载地址:http://download.virtualbox.org/virtualbox/4.3.12/

  8. adb INSTALL_FAILED_UPDATE_INCOMPATIBLE

    今天用Eclipse运行项目时出错: LOG: [2018-05-09 14:16:19 - Module_Android_Demo] ------------------------------ [ ...

  9. 开发JSP自定义标签

    互联网上有很多种自定义标签,今天学的这种非常简单哟 1 编写一个普通类在类中定义一个经常使用得到的 函数 如public String toUpper(String str){ ...... } 2 ...

  10. centos系统vsftpd的一些配置

    一.检测FTP是否安装: 右击打开终端输入 rpm –q vsftpd 显示 package vsftpd is not installed 说明没有被安装 安装时输入命令:yum install v ...