http://acm.hdu.edu.cn/showproblem.php?pid=1010
最近自己的状态好像很糟很糟...
不知道在想些什么。也不知道在做些什么...
总之 糟透了///...
#include <iostream>
#include <cmath>
using namespace std;
char map[10][10];
int dir[4][2]={{-1,0},{1,0},{0,-1},{0,1}};
bool flag;
int n,m,t;
int ex,ey;
void DFS(int sx,int sy,int t){
if (t<0||flag)
return ;
//剪枝1 时间到了以后在D上则设置flag=1退出,否则直接退出
if (t==0){
if (sx==ex&&sy==ey)
flag=true;
return ;
}
//剪枝2 奇偶性剪枝
//起点和终点确定以后就可以确定走的步数是奇数还是偶数,通过这个特点来剪枝
int temp;
temp=abs(sx-ex)+abs(sy-ey)-t;
if (temp>0||temp&1)
return;
int i,nx,ny;
for (i=0;i<4;i++){
nx=sx+dir[i][0];
ny=sy+dir[i][1];
if (nx>=0&&nx<n&&ny<m&&ny>=0&&map[nx][ny]!='X'){
map[nx][ny]='X'; //这里设置的是next
DFS(nx,ny,t-1);
map[nx][ny]='.'; //回溯
}
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int i,j,sx,sy,wall;
char c;
while (scanf("%d%d%d",&n,&m,&t)!=EOF){
if (n==0&&m==0&&t==0)
break;
wall=0;
for (i=0;i<n;i++){
scanf("%s",map[i]);
for (j=0;j<m;j++){
c=map[i][j];
if (c=='S'){
sx=i;
sy=j;
}
else if (c=='D'){
ex=i;
ey=j;
}
else if (c=='X')
wall++;
}
}
//剪枝3 能走的格子应该比时间多1
if (m*n-wall<=t)
printf("NO\n");
else {
flag=false;
map[sx][sy]='X';
DFS(sx,sy,t);
if (flag)
printf("YES\n");
else printf("NO\n");
}
}
return 0;
}