//迷宫问题: HDU 1010
//http://acm.hdu.edu.cn/showproblem.php?pid=1010
#include<iostream>
#include<cmath>
using namespace std;
int dx,dy,sx,sy,n,m,t,flag;
char a[8][8];//用来保存地图
int st[4][2]={{1,0},{-1,0},{0,-1},{0,1}};//用来控制上下左右移动
void f(int x,int y,int k)
{
int temp = t-k-(abs(x-dx)+abs(y-dy));//剪枝:如果剩下的时间为奇数,那么一定不能通过此点到达终点
if(temp<0 || temp%2!=0)
{
return;
}
int i,xz,yz;
for(i = 0; i < 4; i++)
{
xz=x+st[i][0];
yz=y+st[i][1];
if(a[xz][yz]=='.' && (xz>0&&xz<=n) && (yz>0&&yz<=m))
{
a[xz][yz] = 'X';//在(zx,zy)这个点上是不可以走的
f(xz,yz,k+1);//以(zx,zy)为起点继续搜索
a[xz][yz] = '.';//离开(zx,zy)点又标记为可走
if(flag)//如果flag为真表示已经到达终点
{
return ;
}
}
if(a[xz][yz]=='D' && k==t-1)//判断是否到达终点
{
flag = 1;
return ;
}
}
return ;
}
int main()
{
while(cin >> n >> m >> t && n||m||t)
{
for(int i = 1; i <= n; i++)
for(int j=1; j <= m; j++)
{
cin >> a[i][j];
if(a[i][j] == 'S')//标记起点
{
sx = i;
sy = j;
}
if(a[i][j] == 'D')//标记终点
{
dx = i;
dy = j;
}
}
flag = 0;
f(sx,sy,0);//从起点开始搜索,时间从0开始
if(flag)//若flag为真,表示到达终点输出YES
cout<<"YES"<<endl;
else//否则输出NO
cout<<"NO"<<endl;
}
return 0;
}
HDU 1010 搜索
最新推荐文章于 2018-08-28 11:01:25 发布