标签:
AC小公主很喜欢设计迷宫,她设计的迷宫只有两个口,一个入口,一个出口。但小公主有时候很调皮,她会让挑战者走不出迷宫。现在给你AC小公主的迷宫请你判断挑战者能否成功从出口走出迷宫,迷宫包证边界为障碍物,只有两个不同的入口。 “#”代表障碍物,“*”代表可走的路。
输入有多组,每组输入两个正整数n,m( 2 < n < m < 1000)。 接下来n行,每行有m个字符。
每组测试实例,若挑战者能走出迷宫输出”YES”,否则输出“NO”。
3 3 #*# #*# #*# 3 3 #*# ### #*#
YES NO
AC代码:
#include<cstdio> #include<cstring> #include<queue> using namespace std; char str[1005][1005]; bool flag[1005][1005]; int dri[4][2]= {{-1,0},{1,0},{0,-1},{0,1}}; struct Door { int x,y; } door[2]; int bfs(int n,int m) { memset(flag,false,sizeof(flag)); queue<Door>q; Door now,next; q.push(door[0]); flag[door[0].x][door[0].y]=true; while(!q.empty()) { now=q.front(); q.pop(); if(now.x==door[1].x && now.y==door[1].y) return 1; for(int i=0; i<4; i++) { next.x=now.x+dri[i][0]; next.y=now.y+dri[i][1]; if(next.x>=0&&next.x<n && next.y>=0&&next.y<m && next.x==door[1].x && next.y==door[1].y) return 1; else if(next.x>=0&&next.x<n && next.y>=0&&next.y<m && !flag[next.x][next.y] && str[next.x][next.y]==‘*‘) { q.push(next); flag[next.x][next.y]=true; } } } return -1; } int main() { int n,m,i; while(scanf("%d%d",&n,&m)==2) { getchar(); for(i=0; i<n; i++) scanf("%s",str[i]); int num=0; for(i=0; i<m; i++) { if(str[0][i]==‘*‘) { door[num].x=0; door[num].y=i; num++; } if(str[n-1][i]==‘*‘) { door[num].x=n-1; door[num].y=i; num++; } } for(i=1; i<n-1; i++) { if(str[i][0]==‘*‘) { door[num].x=i; door[num].y=0; num++; } if(str[i][m-1]==‘*‘) { door[num].x=i; door[num].y=m-1; num++; } } int ans=bfs(n,m); if(ans==1) printf("YES\n"); if(ans==-1) printf("NO\n"); } return 0; }
标签:
原文地址:http://www.cnblogs.com/a-clown/p/5918044.html