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

2.0 s

memory limit per test

256 MB

input

standard input

output

standard output

Vitaly works at the warehouse. The warehouse can be represented as a grid of n × m cells, each of which either is free or is occupied by a container. From every free cell it's possible to reach every other free cell by moving only through the cells sharing a side. Besides that, there are two robots in the warehouse. The robots are located in different free cells.

Vitaly wants to swap the robots. Robots can move only through free cells sharing a side, moreover, they can't be in the same cell at the same time or move through each other. Find out if the swap can be done.

Input

The first line contains two positive integers n and m (2 ≤ n·m ≤ 200000) — the sizes of the warehouse.

Each of the next n lines contains m characters. The j-th character of the i-th line is «.» if the corresponding cell is free, «#» if there is a container on it, «1» if it's occupied by the first robot, and «2» if it's occupied by the second robot. The characters «1» and «2» appear exactly once in these lines.

Output

Output «YES» (without quotes) if the robots can be swapped, and «NO» (without quotes) if that can't be done.

Examples
input

Copy
5 3

###

#1#

#.#

#2#

###
output
NO
input
3 5

#...#

#1.2#

#####
output
YES
题意:给你一个n*m的图,“#”为墙,“。”是可以走的路图中有两个机器人1和2,问你是否可以通过通过1,和 2 的移动使得 1 和 2 的位置互换,1和2不能同时在一个位置。
可以输出YES,不能输出NO。
思路:刚看到这道题就想到用bfs做,但是不知道怎么通过bfs来判断它是否可以使他们的位置互换。然后通过画图分析才知道只要它满足几种情况中的一种就可以了 1.1,2有一条通路,且与1,2相通的所有点(包括1,2)中有一个点的四个方向有三个不是墙就可以了。 2.1,2有两条通路
代码:
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
struct st{
int x;
int y;
};
queue<st> q;
int x[5]={0,1,0,-1};//
int y[5]={1,0,-1,0};
char mp[200010];
int vt[200010];
int n,m,lg,lg1;
int x1,y1,x2,y2;
int check(int x,int y){//判断是否越界
if(x>0&&x<=n&&y>0&&y<=m)
return true;
return false;
}
int bfs(int x3,int y3){
int i,j;
st a,b;
a.x=x3;
a.y=y3;
q.push(a);
int sum;
vt[(x3-1)*m+y3]=1;
while(!q.empty()){
a=q.front();
q.pop();
sum=0;
//printf("%d %d ",a.x,a.y);
for(i=0;i<4;i++){
b.x=a.x+x[i];
b.y=a.y+y[i];
if(check(b.x,b.y)&&mp[(b.x-1)*m+b.y]!='#'){
sum++;//计算a这个点的四周可以走的地方的数量
if(!vt[(b.x-1)*m+b.y])
{
q.push(b);
vt[(b.x-1)*m+b.y]=1;
}
}
}
//printf("%d\n",sum);
/*3 6
#.##.#
.1..2.
#.##.#*/
if(sum>=3)
lg=1;
}
return 0;
}
int main(){ int i,j;
int sum1=0;
lg=0;
lg1=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
getchar();
char c;
for(j=1;j<=m;j++)
{
scanf("%c",&c);
if(c=='1')
x1=i,y1=j;
else if(c=='2')
x2=i,y2=j;
mp[(i-1)*m+j]=c;
}
}
for(i=0;i<4;i++)//从1点往四个方向bfs
{
if(check(x1+x[i],y1+y[i])&&(mp[(x1+x[i]-1)*m+y1+y[i]]!='#')){
sum1++;
memset(vt,0,sizeof(vt));
vt[(x1-1)*m+y1]=1;
bfs(x1+x[i],y1+y[i]);
if(vt[(x2-1)*m+y2])
lg1++;//记录每个方向的是否可以到达2,不用记录一个方向一共有几条可以到2的路,因为如果它有多条一定至少有一个点三个方向是非墙的
}
}
if(sum1>=3)
lg=1;
if((lg+lg1)>1)
printf("YES\n");
else
printf("NO\n");
return 0;
}

  


Gym - 100971J (思维+简单bfs)的更多相关文章

  1. LightOJ 1012 简单bfs,水

    1.LightOJ 1012  Guilty Prince  简单bfs 2.总结:水 题意:迷宫,求有多少位置可去 #include<iostream> #include<cstr ...

  2. POJ3185(简单BFS,主要做测试使用)

    没事做水了一道POJ的简单BFS的题目 这道题的数据范围是20,所以状态总数就是(1<<20) 第一次提交使用STL的queue,并且是在队首判断是否达到终点,达到终点就退出,超时:(其实 ...

  3. 【POJ 3669 Meteor Shower】简单BFS

    流星雨撞击地球(平面直角坐标第一象限),问到达安全地带的最少时间. 对于每颗流星雨i,在ti时刻撞击(xi,yi)点,同时导致(xi,yi)和上下左右相邻的点在ti以后的时刻(包括t)不能再经过(被封 ...

  4. hdu1312 Red and Black 简单BFS

    简单BFS模版题 不多说了..... 直接晒代码哦.... #include<cstdlib> #include<iostream> #include<cstdio> ...

  5. 逃脱 (简单BFS)

    题目传送门 G逃脱  题目描述 这是mengxiang000和Tabris来到幼儿园的第四天,幼儿园老师在值班的时候突然发现幼儿园某处发生火灾,而且火势蔓延极快,老师在第一时间就发出了警报,位于幼儿园 ...

  6. Gym - 101572D Distinctive Character bfs 思维

    题目传送门 题目大意: 给出n个01串,让你构造一个字符串,使这个字符串和这些字符串中相似程度最高 尽可能低.如果两个字符串对应位置相同,则相似程度加一. 思路: 每一个01串更改自己的一部分后,都可 ...

  7. Gym 100971A Treasure Island BFS 思维题

    A - Treasure Island Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64 ...

  8. Gym 101917 E 简单计算几何,I 最大流

    题目链接 https://codeforces.com/gym/101917 E 题意:给定一个多边形(n个点),然后逆时针旋转A度,然后对多边形进行规约,每个点的x规约到[0,w]范围内,y规约到[ ...

  9. Codeforces gym 100685 F. Flood bfs

    F. FloodTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100685/problem/F Desc ...

随机推荐

  1. 创建型模式之Builder(建造者)模式

    GitHub地址:https://github.com/zhangboqing/design-mode/tree/master/src/main/java/com/zbq     一.定义 建造者模式 ...

  2. Ubuntu/Debian nginx 简介

    Linux运营维护(简称运维) 这里是简单的使用介绍: 参考:http://einverne.github.io/post/2017/06/ubuntu-debian-install-nginx.ht ...

  3. 内核开启VF小结

    2017-8-29 16:33:40 内核开启VF小结: 1. eth2上创建4个VFecho 4 > /sys/class/net/eth2/device/sriov_numvfs2. 关闭e ...

  4. vmware 10.0 安装centos6.5 客户系统 几个问题

    1. vmware 10.0 安装centos6.5 客户系统 无法修改分辨率 要安装 desktop, KDE, legacy,x  组件 2. NAT 方式网卡无法自行启动 vim /etc/sy ...

  5. 架构探险笔记5-使框架具备AOP特性(下)

    开发AOP框架 借鉴SpringAOP的风格,写一个基于切面注解的AOP框架.在进行下面的步骤之前,确保已经掌了动态代理技术. 定义切面注解 /** * 切面注解 */ @Target(Element ...

  6. php中Redis的扩展

    首先要下载 php_redis.dll 和 php_igbinary.dll 在官网(https://windows.php.net/downloads/pecl/snaps/redis/3.1.4/ ...

  7. python基础之 025 模块加载与import的使用

    内容梗概: 1. 模块 2. import 3. from xxx import xxx 1.模块定义:模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀.目前写的所有 ...

  8. flexbox与grid layout的区别

    flexbox是一种针对一维的局部布局,以轴为核心的弹性布局. grid layout是二维的更加全面的网格布局,

  9. token原理详解

    概念与使用流程 是计算机术语:令牌,令牌是一种能够控制站点占有媒体的特殊帧,以区别数据帧及其他控制帧.token其实说的更通俗点可以叫暗号,在一些数据传输之前,要先进行暗号的核对,不同的暗号被授权不同 ...

  10. iphone手机在网页返回上一页时,部分字体变大问题

    最近做一个项目是,发现了一个iphone的兼容性问题,在返回上一页后,部分字体会变大,刷新就会正常. 经过总结,发现都是span标签里面的字体变大.经过查询发现,需要给span添加一个属性:displ ...