杭电1010题
//迷宫求解问题
//思路:深度优先搜索
#include <iostream>
#include <math.h>
using namespace std;
#define max 8
char map[max][max];
int axisx[]={0,-1,0,1}; //代表行上的偏移
int axisy[]={-1,0,1,0}; //代表列上的偏移
int dx,dy;
int t;
int n,m;
bool escape;
void dfs(int sx,int sy,int cnt) //cnt代表现在已经过的时间
{
if(sx == dx && sy == dy && cnt==t)
{
escape = true;
return;
}
int temp = (t-cnt)-abs(sx-dx)-abs(sy-dy);
if(temp<0 || temp&1) //temp<0代表剩余的时间无法走完剩余的路程 temp&1是进行奇偶剪枝
{
escape = false;
return;
}
for(int i=0;i<4;++i)
{
if(sx+axisx[i]<0 || sx+axisx[i]>n-1 || sy+axisy[i]<0 || sy+axisy[i]>m-1)
continue;
if(map[sx+axisx[i]][sy+axisy[i]]!='X')
{
map[sx+axisx[i]][sy+axisy[i]] = 'X';
dfs(sx+axisx[i],sy+axisy[i],cnt+1);
map[sx+axisx[i]][sy+axisy[i]] = '.'; //别忘了深度优先遍历之后进行还原
}
if(escape)
break;
}
}
int main()
{
//freopen("1.txt","r",stdin);
while(cin>>n>>m>>t && !(n==0 && m==0 && t==0))
{
escape = false;
int sx,sy; //sx代表sx行,sy代表sy列
int wallnum = 0;
for(int i1=0;i1<n;++i1) //第i1行
{
for(int i2=0;i2<m;++i2) //第i2列
{
cin>>map[i1][i2];
if(map[i1][i2]=='S')
{
sx = i1;
sy = i2;
map[sx][sy] = 'X';
}
else if(map[i1][i2]=='D')
{
dx = i1;
dy = i2;
}
else if(map[i1][i2]=='X')
wallnum++;
}
}
if(!(n*m-wallnum<t)) //剩下的block块数小于时间则进行剪枝
{
dfs(sx,sy,0);
}
if(escape)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
//fclose(stdin);
return 0;
}
浙公网安备 33010602011771号