http://acm.hdu.edu.cn/showproblem.php?pid=1010
奇偶剪枝,说好的里程碑来了。。。
跳出dfs的时候一定要注意确保跳出。。。我开始写的时候没有跳出dfs只是跳出了一层递归,导致长时间tle,orz涂涂能看出这种问题。
View Code
#include <iostream> #include <queue> using namespace std ; int n,m,t ; int flag ; int e ; char map[10][10] ; void dfs(int x,int y,int time) { int tab[][2]={1,0,-1,0,0,1,0,-1} ; if(flag) return ; if(time==t && map[x][y]=='D') { flag=1 ; return ; } int temp=abs(x-y)&1 ; if(temp==e && (t-time)&1) return ; if(temp!=e && (t-time)&1==0) return ; map[x][y]='X' ; int xx,yy ; for(int i=0;i<4;i++) { xx=x+tab[i][0] ; yy=y+tab[i][1] ; if(xx<0 || xx>=n)continue ; if(yy<0 || yy>=m)continue ; if(map[xx][yy]=='X')continue ; if(map[xx][yy]=='D' && time+1!=t)continue ; dfs(xx,yy,time+1) ; map[xx][yy]='.' ; } } int main() { while(scanf("%d%d%d",&n,&m,&t),(n||m||t)) { for(int i=0;i<n;i++) scanf("%s",map[i]) ; int xx,yy ; int cnt=0 ; for(int i=0;i<n;i++) for(int j=0;j<m;j++) { if(map[i][j]=='S') xx=i,yy=j ; if(map[i][j]=='D') e=abs(i-j)&1 ; if(map[i][j]=='X') cnt++ ; } if(n*m-cnt<t) { puts("NO") ; continue ; } flag=0 ; dfs(xx,yy,0) ; if(flag) puts("YES") ; else puts("NO") ; } return 0 ; }