描述


一个N × M的2D迷宫中有两个机器人。机器人A在迷宫左上角,只能向右或向下移动;机器人B在迷宫右下角,只能向左或向上移动。机器人不能移动到迷宫外。此外,由于奇怪的同步机制,这两个机器人只能同时向相反的方向移动。也就是说或者机器人A向右同时机器人B向左;或者机器人A向下同时机器人B向上移动。

迷宫中有一些格子存在障碍,机器人不能移动到有障碍的格子上。如果某个机器人的移动方向上的下一个格子有障碍,它会停在当前格子上;这时另一个机器人不受影响,仍能向相反方向移动。迷宫范围之外可以视为全部都是障碍。

此外,两个机器人在移动中不能“相撞”。相撞是指:

  1. 两个机器人同时处在同一个格子上;
  2. 两个机器人在一次移动中互换位置。

    小Hi想知道,最少经过多少次移动可以使机器人A走到右下角,同时机器人B走到左上角。

输入


第一行包含两个正整数N和M。 (1 ≤ N, M ≤ 50)

以下是一个N × M的01矩阵,其中0表示格子上没有障碍,1表示格子上有障碍。

1 x u

2 x

第一种表示将第x号节点的权值修改为u

第二种表示询问以第x号节点为根的子树中,最小的权值是多少。

对于30%的数据,1 ≤ N, Q ≤ 1000

对于100%的数据,1 ≤ N, Q ≤ 100000, -109 <= Vi, u <= 109

输出


输出一个整数代表最少移动的步数。如果目标不能达成,输出-1。

样例输入

  1. 5 5
  2. 00001
  3. 00000
  4. 00100
  5. 01000
  6. 00000

样例输出

  1. 9

题解


直接搜索。。。

  1. #include <queue>
  2. #include <cmath>
  3. #include <cstdio>
  4. #include <complex>
  5. #include <cstring>
  6. #include <cstdlib>
  7. #include <iostream>
  8. #include <algorithm>
  9. #define ll long long
  10. #define inf 1000000000
  11. #define PI acos(-1)
  12. #define bug puts("here")
  13. #define REP(i,x,n) for(int i=x;i<=n;i++)
  14. #define DEP(i,n,x) for(int i=n;i>=x;i--)
  15. #define mem(a,x) memset(a,x,sizeof(a))
  16. using namespace std;
  17. inline int read(){
  18. int x=0,f=1;char ch=getchar();
  19. while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
  20. while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
  21. return x*f;
  22. }
  23. inline void Out(int a){
  24. if(a<0) putchar('-'),a=-a;
  25. if(a>=10) Out(a/10);
  26. putchar(a%10+'0');
  27. }
  28. const int N=55;
  29. char map[N][N];
  30. bool vis[N][N][N][N];
  31. int next1[2][2]={1,0,0,1};
  32. int next2[2][2]={-1,0,0,-1};
  33. int n,m;
  34. struct node{
  35. int x1,y1;
  36. int x2,y2;
  37. int step;
  38. node(){}
  39. node(int t1,int t2,int t3,int t4){
  40. x1=t1;y1=t2;
  41. x2=t3;y2=t4;
  42. step=0;
  43. }
  44. };
  45. int bfs(){
  46. queue<node>que;
  47. node tmp=node(1,1,n,m),cur;
  48. vis[1][1][n][m]=true;
  49. que.push(tmp);
  50. while(!que.empty()){
  51. cur=que.front();que.pop();
  52. if(cur.x1==n&&cur.y1==m&&cur.x2==1&&cur.y2==1) return cur.step;
  53. REP(i,0,1){
  54. tmp.x1=cur.x1+next1[i][0];
  55. tmp.y1=cur.y1+next1[i][1];
  56. tmp.x2=cur.x2+next2[i][0];
  57. tmp.y2=cur.y2+next2[i][1];
  58. if(tmp.x1==tmp.x2&&tmp.y1==tmp.y2) continue;
  59. if(tmp.x1==cur.x2&&tmp.y1==cur.y2) continue;
  60. if(tmp.x1<1||tmp.x1>n||tmp.y1<1||tmp.y1>m) tmp.x1=cur.x1,tmp.y1=cur.y1;
  61. if(tmp.x2<1||tmp.x2>n||tmp.y2<1||tmp.y2>m) tmp.x2=cur.x2,tmp.y2=cur.y2;
  62. if(map[tmp.x1][tmp.y1]=='1') tmp.x1=cur.x1,tmp.y1=cur.y1;
  63. if(map[tmp.x2][tmp.y2]=='1') tmp.x2=cur.x2,tmp.y2=cur.y2;
  64. if(vis[tmp.x1][tmp.y1][tmp.x2][tmp.y2]) continue;
  65. vis[tmp.x1][tmp.y1][tmp.x2][tmp.y2]=true;
  66. tmp.step=cur.step+1;
  67. que.push(tmp);
  68. }
  69. }
  70. return -1;
  71. }
  72. int main()
  73. {
  74. n=read();m=read();
  75. REP(i,1,n) scanf("%s",map[i]+1);
  76. printf("%d\n",bfs());
  77. return 0;
  78. }

【HIHOCODER 1575】 两个机器人(BFS)的更多相关文章

  1. 10分钟用Python告诉你两个机器人聊天能聊出什么火花

    欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 现在不是讲各种各样的人工智能嘛,AI下棋,AI客服,AI玩家--其实我一直很好奇,两个AI碰上会怎样,比如一起下棋,一起打游戏-- 今天做个 ...

  2. CSUOJ 1726 你经历过绝望吗?两次!BFS+优先队列

    Description 4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活.当地15名消防员耗时一天解救围困的"猪坚强".不过与在废 ...

  3. hihocoder 前两题思路

    1800 : 玩具设计师 二维前缀和的写法有很多,最常见的是s[x-1][y]+s[x][y-1]-s[x-1][y-1]+a[x][y]; 涉及二维矩阵求和,联想前缀和,求>=指定面积的最大耐 ...

  4. [Bzoj3205][Apio2013]机器人(斯坦纳树)(bfs)

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 977  Solved: 230[Submit][Status] ...

  5. hihocoder #1170 机器人 &amp;&amp; 编程之美2015复赛

    题意: 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小冰的N个机器人兄弟排成一列,每一个机器人有一个颜色. 如今小冰想让同一颜色的机器人聚在一起.即随意两个同颜色的 ...

  6. hihoCoder 1426 : What a Ridiculous Election(总统夶选)

    hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...

  7. Gym - 100971J (思维+简单bfs)

    题目链接:http://codeforces.com/gym/100971/problem/J J. Robots at Warehouse time limit per test 2.0 s mem ...

  8. bzoj3205 [Apio2013]机器人

    3205: [Apio2013]机器人 Time Limit: 15 Sec  Memory Limit: 128 MBSubmit: 953  Solved: 227[Submit][Status] ...

  9. BZOJ3205/UOJ107 [Apio2013]机器人

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

随机推荐

  1. SpringBoot | 问题 | 注解方式下无法发现Bean

    在排除注解的问题后,考虑扫描类的位置, [SpringBoot项目的Bean装配默认规则是根据Application类所在的包位置从上往下扫描! “Application类”是指SpringBoot项 ...

  2. 跟我一起玩Win32开发(1):关于C++的几个要点

    我不知道各位,一提起C++,第一感觉是什么?而据俺的观察,许多人几乎成了“谈C色变”.不管是C还是C++,一直以来都被很多人视为相当难学的玩意儿,幸好只是一个C++,没有C--,C**和C//,不然, ...

  3. UvaLive3942(Trie + dp)

    查了半天数组越界的RE,才发现自己把ch数组放结构体里是过大的……放全局就A了. 类似区间的dp比较显然,只是用trie树做了优化,使得可以在trie树里一边走一边往上加dp值,不必枚举以前的每个位置 ...

  4. N Queen Again LightOJ - 1061

    N Queen Again LightOJ - 1061 首先预处理(或打表)出所有八皇后的解法(只有92种).然后枚举目标状态,对于每一个目标状态用一个状压dp求出到达那个状态的最小费用.到达任何一 ...

  5. RHEL 6.5----LVS(DR)

    主机名 IP  所需软件  master eth0==>192.168.30.140(Nat) eth0:1==>192.168.17.130(Nat) ipvsadm node-1 et ...

  6. [转]ASP.NET MVC Bootstrap极速开发框架

    本文转自:http://www.cnblogs.com/smartbooks/p/3814927.html 前言 每次新开发项目都要从头开始设计?有木有一个通用的快速开发框架?并且得是ASP.NET ...

  7. LinQ的使用

    LinQ:LinQ to Sql类 它是一个集成化的数据访问类,微软将原本需要我们自己动手去编写的一些代码,集成到了这个类中,会自动生成. LinQ的创建: 添加项——添加新项(LinQ to Sql ...

  8. ES6学习笔记(6)----函数的扩展

    参考书<ECMAScript 6入门>http://es6.ruanyifeng.com/ 函数的扩展 函数的默认值 : ES6可以为函数指定默认值 (1)指定默认值的两种方式 a.函数参 ...

  9. Vue 2.0入门基础知识之内部指令

    1.Vue.js介绍 当前前端三大主流框架:Angular.React.Vue.React前段时间由于许可证风波,使得Vue的热度蹭蹭地上升.另外,Vue友好的API文档更是一大特色.Vue.js是一 ...

  10. netcdf源码在windows上的编译

    作者:朱金灿 来源:http://blog.csdn.net/clever101 今天搞搞netcdf源码在windows上的编译,折腾了半天,算是搞成了,特地记录一下过程.我的目标是要生成netcd ...