找到小菇凉
Time Limit:1000MS Memory Limit:65536K
Total Submit:80 Accepted:13
Description
天凉了,小菇凉天天被扇子妈关在家里不让她到处跑。小菇凉觉得很无聊。这天,趁着扇子妈出门,小菇凉偷偷溜出门去玩。因为太久没出门太开心了,小菇凉一不小心就跑到了很远的地方,很晚都没有回家。扇子妈妈很担心,于是找到小光头问他是否看到小菇凉。小光头知道小菇凉会跑到很远的森林里去玩,于是决定帮扇子妈去找小菇凉。天色已经很晚了,小光头希望尽快找到小姑凉。
Input
输入第一行两个整数N,M(1 <= N,M <= 1000)表示森林的大小。
接下来一个N*M的矩阵由“#”,“.”组成。“#”表示该地为高灌木,小光头不能通过。“.”表示该地为空地,小光头能通过。地图上仅有一个“A”表示小姑凉的位置,一个“B”表示小光头的位置。
Output
当小光头能看到小菇凉时(即小光头和小菇凉在同行或同列,中间没有障碍时)表示小光头找到了小菇凉。若小光头能找到小菇凉,输出最快找到小菇凉的时间。若不能找到小菇凉,输出No!!!
Sample Input
5 5
...A#
##...
..B##
#####
.....
Sample Output
2
AC code:
#include<iostream>
#include<stdio.h>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<cstdlib>
#include<string.h>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
#define EPS 1e-9
using namespace std;
struct node{
int x;
int y;
int sp;
}sta[1000010];
int n,m;
int dir[4][2]={0,1,0,-1,-1,0,1,0};
char ma[1001][1001];
int vis[1001][1001];
void BFS(int x,int y,int dx,int dy)
{
queue<node>q;
int xx,yy,ok,i,j;
memset(vis,0,sizeof(vis));
node cur,nex;
cur.x=x;
cur.y=y;
cur.sp=0;
q.push(cur);
vis[x][y]=1;
while(!q.empty())
{
cur=q.front();
q.pop();
xx=cur.x;
yy=cur.y;
ok=0;
if(xx==dx)
{
for(j=yy;j>=0;j--)
{
if(ma[xx][j]=='A')
{
ok=1;
break;
}
else if(ma[xx][j]=='#')
break;
}
for(j=yy+1;j<m;j++)
{
if(ma[xx][j]=='A')
{
ok=1;
break;
}
else if(ma[xx][j]=='#')
break;
}
}
else if(yy==dy)
{
for(j=xx;j>=0;j--)
{
if(ma[j][yy]=='A')
{
ok=1;
break;
}
else if(ma[j][yy]=='#')
break;
}
for(j=xx+1;j<n;j++)
{
if(ma[j][yy]=='A')
{
ok=1;
break;
}
else if(ma[j][yy]=='#')
break;
}
}
if(ok)
{
printf("%d\n",cur.sp);
return;
}
for(i=0;i<4;i++)
{
nex.x=xx+dir[i][0];
nex.y=yy+dir[i][1];
nex.sp=cur.sp+1;
if(nex.x>=0&&nex.x<n&&nex.y>=0&&nex.y<m&&ma[nex.x][nex.y]!='#'&&!vis[nex.x][nex.y])
{
q.push(nex);
vis[nex.x][nex.y]=1;
}
}
}
printf("No!!!\n");
}
int main()
{
// freopen("D:\\in.txt","r",stdin);
int i,j,sx,sy,dx,dy;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=0;i<n;i++)
{
scanf("%s",ma[i]);
for(j=0;j<m;j++)
{
if(ma[i][j]=='A')
{
dx=i;
dy=j;
}
else if(ma[i][j]=='B')
{
sx=i;
sy=j;
}
}
}
BFS(sx,sy,dx,dy);
}
return 0;
}