NEFU 558:点击打开链接
迷宫寻路
Problem:558
Time Limit:1000ms
Memory Limit:65536K
Description
AC小公主很喜欢设计迷宫,她设计的迷宫只有两个口,一个入口,一个出口。但小公主有时候很调皮,她会让挑战者走不出迷宫。现在给你AC小公主的迷宫请你判断挑战者能否成功从出口走出迷宫,迷宫包证边界为障碍物,只有两个不同的入口。 “#”代表障碍物,“*”代表可走的路。
Input
输入有多组,每组输入两个正整数n,m( 2 < n < m < 1000)。 接下来n行,每行有m个字符。
Output
每组测试实例,若挑战者能走出迷宫输出”YES”,否则输出“NO”。
Sample Input
3 3 #*# #*# #*# 3 3 #*# ### #*#
Sample Output
YES NO
Hint
Source
难度:水(DFS基础题)
AC代码:
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
char a[1005][1005];
bool is_way(int x,int y,int si,int sj)
{
if(x==0||x>n||y==0||y>m)
{
if(abs(si-x)+abs(sj-y)!=1)
return 1;
else
return 0;
}
else if(a[x][y]=='*')
{
a[x][y]='#';
int ans=is_way(x-1,y,si,sj)+is_way(x+1,y,si,sj)+is_way(x,y-1,si,sj)+is_way(x,y+1,si,sj);
if(ans>0)
return 1;
else
return 0;
}
else
return 0;
}
int main()
{
while(scanf("%d %d",&n,&m)!=EOF)
{
getchar();
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
scanf("%c",&a[i][j]);
getchar();
}
int ans=0;
for(int i=1;i<=n&&!ans;i++)
if(a[i][1]=='*')
ans=is_way(i,1,i,1);
for(int i=1;i<=n&&!ans;i++)
if(a[i][m]=='*')
ans=is_way(i,m,i,m);
for(int j=1;j<=m&&!ans;j++)
if(a[1][j]=='*')
ans=is_way(1,j,1,j);
for(int j=1;j<=m&&!ans;j++)
if(a[n][j]=='*')
ans=is_way(n,j,n,j);
if(ans) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}