this is bad problom | ||||||
| ||||||
Description | ||||||
周末了,小辉在大街上无聊地压马路,突然他想去找女童鞋一起快乐地玩耍,但是他有个毛病就是讨厌走路,他现在想知道到每个女童鞋那里的最少步数,再决定找哪个女童鞋。 首先给出小辉和女童鞋所在的N*N平面图,如图为6*6平面图。 ....#.
.*.#..
......
######
......
......
有Q个女童鞋,每个女童鞋所在的地点用坐标表示,左上角处坐标为(0,0)。 图中'*'代表小辉所在的位置,即(1,1),'.'代表空地,'#'代表不能直接通过的建筑物。 小辉将去找他所能到达的并且离他步数最少的那个女童鞋。 女童鞋的位置可能在除建筑物的任意位置上。 | ||||||
Input | ||||||
有多组测试数据,处理到文件结束。 对于每组测试数据,第一行是两个整数N(2<=N<=100),Q(1<=Q<=1000),分别代表地区的边长和女童鞋的个数. 接下来输入n*n平面图,代表地区平面图。 然后Q行,每行一个坐标代表女童鞋所在位置。 | ||||||
Output | ||||||
输出小辉到那个女童鞋的步数,如果没有满足条件的女童鞋,则输出cry,最后换行. | ||||||
Sample Input | ||||||
6 3
....#.
.*.#..
......
######
......
......
0 0
1 4
5 3
3 2
*..
###
...
2 0
2 1 | ||||||
Sample Output | ||||||
2
cry | ||||||
Source | ||||||
新生练习赛(2013.11.16) | ||||||
Author | ||||||
xuxu@hrbust |
基础bfs,有两个坑点:
1、女孩可能卡在墙里面。
2、女孩可能就在小辉身上。
思路:直接在地图上标记女孩的位置然后bfs就好。
附上AC代码
#include<cstring>
#include<queue>
#include<cstdio>
using namespace std;
int n;
char Map[106][106];
int vis[106][106];
typedef struct{
int x,y,n;
}poi;
int f[4][2] = {{0,1},{1,0},{0,-1},{-1,0}};
void bfs(int x,int y)
{
memset(vis,0,sizeof(vis));
poi start;
start.x = x;
start.y = y;
start.n = 0;
vis[x][y]=1;
queue<poi> p;
p.push(start);
while(!p.empty()){
poi temp = p.front();
p.pop();
for(int i = 0 ; i < 4 ; i++){
poi next;
next.x = temp.x+f[i][0];
next.y = temp.y+f[i][1];
next.n = temp.n+1;
if(Map[next.x][next.y]=='&'){
printf("%d\n",next.n);
goto mark;
}
else if(Map[next.x][next.y]!='#'&&next.x<n&&next.y<n&&next.x>=0&&next.y>=0&&vis[next.x][next.y]==0){
vis[next.x][next.y]=1;
p.push(next);
}
}
}
printf("cry\n");
mark:;
}
void solve(void)
{
int q;
while(~scanf("%d%d",&n,&q)){
for(int i = 0 ; i < n ; i++) scanf("%s",Map[i]);
for(int i =0 ; i < q ; i++){
int x,y;
scanf("%d%d",&x,&y);
if(Map[x][y]=='*'){
printf("0\n");
goto mark1;
}
Map[x][y] = '&';
}
for(int i = 0 ; i < n ; i++){
for(int j = 0 ; j < n ; j++){
if(Map[i][j]=='*') bfs(i,j);
}
}
mark1:;
}
}
int main(void)
{
solve();
return 0;
}