【HIHOCODER 1575】 两个机器人(BFS)
描述
一个N × M的2D迷宫中有两个机器人。机器人A在迷宫左上角,只能向右或向下移动;机器人B在迷宫右下角,只能向左或向上移动。机器人不能移动到迷宫外。此外,由于奇怪的同步机制,这两个机器人只能同时向相反的方向移动。也就是说或者机器人A向右同时机器人B向左;或者机器人A向下同时机器人B向上移动。
迷宫中有一些格子存在障碍,机器人不能移动到有障碍的格子上。如果某个机器人的移动方向上的下一个格子有障碍,它会停在当前格子上;这时另一个机器人不受影响,仍能向相反方向移动。迷宫范围之外可以视为全部都是障碍。
此外,两个机器人在移动中不能“相撞”。相撞是指:
- 两个机器人同时处在同一个格子上;
- 两个机器人在一次移动中互换位置。
小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。
样例输入
5 5
00001
00000
00100
01000
00000
样例输出
9
题解
直接搜索。。。
#include <queue>
#include <cmath>
#include <cstdio>
#include <complex>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define ll long long
#define inf 1000000000
#define PI acos(-1)
#define bug puts("here")
#define REP(i,x,n) for(int i=x;i<=n;i++)
#define DEP(i,n,x) for(int i=n;i>=x;i--)
#define mem(a,x) memset(a,x,sizeof(a))
using namespace std;
inline int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
inline void Out(int a){
if(a<0) putchar('-'),a=-a;
if(a>=10) Out(a/10);
putchar(a%10+'0');
}
const int N=55;
char map[N][N];
bool vis[N][N][N][N];
int next1[2][2]={1,0,0,1};
int next2[2][2]={-1,0,0,-1};
int n,m;
struct node{
int x1,y1;
int x2,y2;
int step;
node(){}
node(int t1,int t2,int t3,int t4){
x1=t1;y1=t2;
x2=t3;y2=t4;
step=0;
}
};
int bfs(){
queue<node>que;
node tmp=node(1,1,n,m),cur;
vis[1][1][n][m]=true;
que.push(tmp);
while(!que.empty()){
cur=que.front();que.pop();
if(cur.x1==n&&cur.y1==m&&cur.x2==1&&cur.y2==1) return cur.step;
REP(i,0,1){
tmp.x1=cur.x1+next1[i][0];
tmp.y1=cur.y1+next1[i][1];
tmp.x2=cur.x2+next2[i][0];
tmp.y2=cur.y2+next2[i][1];
if(tmp.x1==tmp.x2&&tmp.y1==tmp.y2) continue;
if(tmp.x1==cur.x2&&tmp.y1==cur.y2) continue;
if(tmp.x1<1||tmp.x1>n||tmp.y1<1||tmp.y1>m) tmp.x1=cur.x1,tmp.y1=cur.y1;
if(tmp.x2<1||tmp.x2>n||tmp.y2<1||tmp.y2>m) tmp.x2=cur.x2,tmp.y2=cur.y2;
if(map[tmp.x1][tmp.y1]=='1') tmp.x1=cur.x1,tmp.y1=cur.y1;
if(map[tmp.x2][tmp.y2]=='1') tmp.x2=cur.x2,tmp.y2=cur.y2;
if(vis[tmp.x1][tmp.y1][tmp.x2][tmp.y2]) continue;
vis[tmp.x1][tmp.y1][tmp.x2][tmp.y2]=true;
tmp.step=cur.step+1;
que.push(tmp);
}
}
return -1;
}
int main()
{
n=read();m=read();
REP(i,1,n) scanf("%s",map[i]+1);
printf("%d\n",bfs());
return 0;
}
【HIHOCODER 1575】 两个机器人(BFS)的更多相关文章
- 10分钟用Python告诉你两个机器人聊天能聊出什么火花
欲直接下载代码文件,关注我们的公众号哦!查看历史消息即可! 现在不是讲各种各样的人工智能嘛,AI下棋,AI客服,AI玩家--其实我一直很好奇,两个AI碰上会怎样,比如一起下棋,一起打游戏-- 今天做个 ...
- CSUOJ 1726 你经历过绝望吗?两次!BFS+优先队列
Description 4月16日,日本熊本地区强震后,受灾严重的阿苏市一养猪场倒塌,幸运的是,猪圈里很多头猪依然坚强存活.当地15名消防员耗时一天解救围困的"猪坚强".不过与在废 ...
- hihocoder 前两题思路
1800 : 玩具设计师 二维前缀和的写法有很多,最常见的是s[x-1][y]+s[x][y-1]-s[x-1][y-1]+a[x][y]; 涉及二维矩阵求和,联想前缀和,求>=指定面积的最大耐 ...
- [Bzoj3205][Apio2013]机器人(斯坦纳树)(bfs)
3205: [Apio2013]机器人 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 977 Solved: 230[Submit][Status] ...
- hihocoder #1170 机器人 && 编程之美2015复赛
题意: 时间限制:2000ms 单点时限:1000ms 内存限制:256MB 描写叙述 小冰的N个机器人兄弟排成一列,每一个机器人有一个颜色. 如今小冰想让同一颜色的机器人聚在一起.即随意两个同颜色的 ...
- hihoCoder 1426 : What a Ridiculous Election(总统夶选)
hihoCoder #1426 : What a Ridiculous Election(总统夶选) 时间限制:1000ms 单点时限:1000ms 内存限制:256MB Description - ...
- Gym - 100971J (思维+简单bfs)
题目链接:http://codeforces.com/gym/100971/problem/J J. Robots at Warehouse time limit per test 2.0 s mem ...
- bzoj3205 [Apio2013]机器人
3205: [Apio2013]机器人 Time Limit: 15 Sec Memory Limit: 128 MBSubmit: 953 Solved: 227[Submit][Status] ...
- BZOJ3205/UOJ107 [Apio2013]机器人
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...
随机推荐
- sybase修改默认字符集为cp936
原文地址:http://blog.sina.com.cn/s/blog_4d6854860100xn3f.html 报错信息:2402 error converting characters into ...
- 跟我一起玩Win32开发(8):绘图(A)
从本篇开始,我就不吹牛皮,那就吹吹兔皮吧.说说与绘图有关的东东. 要进行绘制,首先要得到一个DC,啥是DC呢?按字面翻译叫设备上下文,也可以翻译为设备描述表,它主要指API为我们封装了一些与显示设备相 ...
- Codeforces Round #302 (Div. 1) 训练
链接: http://codeforces.com/contest/543 过程: 惨淡的只做出了A和C 题解: A 题解: 简单的一道题 我们用$dp[i][j]$表示当前考虑到前num个人(这个另 ...
- BZOJ1833(数位dp)
这个数位dp倒是没什么限制条件,只是需要在过程中把每个数字出现次数记录一下即可.记忆化返回时数学算出.框架还是套板子. #include <cstdio> #include <cma ...
- Xcode7.1环境下上架iOS App到AppStore 流程 转
来自:http://www.cnblogs.com/ChinaKingKong/p/4957682.html 前言部分 之前App要上架遇到些问题到网上搜上架教程发现都是一些老的版本的教程 ,目前iT ...
- Spark-SQL连接Hive
第一步:修个Hive的配置文件hive-site.xml 添加如下属性,取消本地元数据服务: <property> <name>hive.metastore.local< ...
- oracle 权限、规则
Oracle中关于权限与规则简单总结: --1,管理员登录 conn sys/orcl@orcl as sysdba; --2,创建用户方案---必须管理员身份才能操作 create user use ...
- 修改他人电脑的Windows登录密码
在别人电脑已登录Windows的情况下: 打开控制面板 -> 管理工具 -> 计算机管理 或者 对Win图标单击右键 -> 计算机管理 -> 本地用户和组 -> 用 ...
- Android利用已有控件实现自定义控件
Android控件的基本介绍及使用自定义控件的意义 Android 本身提供了很多控件,自定义控件在android中被广泛运用,自定义控件给了我们很大的方便.比如说,一个视图为imag ...
- CCS3超长文字显示省略号的方法
需求:当文本长度溢出包含元素时以省略号结尾 CSS3实现方法: #MyDIV{overflow:hidden;text-overflow:ellipsis;} 示例:<!DOCTYPE html ...