简单的dfs..还要加上剪枝来处理,
1>当当前的位置即为终点的‘D’的时候并且所走时间大于理论时间,即为不可到达;
2>添加入奇偶剪枝来处理,(ps:奇偶剪枝:即将map[i][j]看成如下图所示
1 0 1 0 1 0 如map[0][0]要走到map[0][2]需要走两步,map[0][1]要走到map[1][0]要走2步,而map[0][0]要走到
0 1 0 1 0 1 map[0][1]需要走1步,也就是说,1->1走偶数步,0->0走偶数步,1->0或者0->1走奇数步;
1 0 1 0 1 0 因此,如果要求从1->1或者0->0,但时间要求是奇数,则不可到达;从1->0或者从0->1要求时间
0 1 0 1 0 1 为偶数,则不可到达;);
3>搜索到结果,则终止搜索;
4>走到当前位置的时间大于理论规定时间则不可到达;
5>迷宫中所有'X'小于时间t的,则不可到达;
(小贴士:好吧,居然犯傻在递归中的t+1写成t++,这么低级的错误。。。。。。。)
#include<iostream>
#include<string>
using namespace std;
char map[7][7];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};//四个可行方向
int m,n,prex,prey,lastx,lasty,time,out;
void DFS(int x,int y,int t)
{
int X,Y,i;
if(out)
return ;
if(x==lastx&&y==lasty&&t==time)//当前的位置为终点的门且时间相等则完成
{
out=1;
return ;
}
if((time-t)%2!=(x+y+lastx+lasty)%2)//奇偶剪枝,步数与当前位置与终点的距离奇偶性不同则返回
return ;
for(i=0;i<4;i++)
{
X=x+dir[i][0];
Y=y+dir[i][1];
if(X>=0&&X<n&&Y>=0&&Y<m&&map[X][Y]!='X')
{
map[X][Y]='X';
DFS(X,Y,t+1);//就是这里的t+1,不能写成t++哦~!!
map[X][Y]='.';//要将该点标记回未访问过,回朔过程;
}
}
}
int main()
{
int i,j;
while(cin>>n>>m>>time)
{
if(n==0&&m==0&&time==0)
break;
else
{
out=0;
memset(map,0,sizeof(map));
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='S')
{
prex=i;
prey=j;
map[i][j]='X';
}
if(map[i][j]=='D')
{
lastx=i;
lasty=j;
}
}
DFS(prex,prey,0);
if(out)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}