标签:
#include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<algorithm> #include<queue> using namespace std; int n,m,t; int sx,sy; int ex,ey; int ok; char mat[10][10]; int vis[10][10]; int op[4][2]={1,0, -1,0, 0,1, 0,-1}; bool isok1(int x,int y,int step) { //printf("\n\n%d %d %d\n",x,y,step); if(ok==1) return false; if(x<0||x>=n||y<0||y>=m) return false; if(vis[x][y]==1||mat[x][y]==‘X‘) return false; if(mat[x][y]==‘D‘&&step!=t) return false; int mlen= abs(x-ex)+abs(y-ey); int alen=t-step; //ans len if(alen<0||alen%2!=mlen%2) return false; return true; } void dfs(int x,int y,int step) { if(ok==1||step>t) return ; if(mat[x][y]==‘D‘&&step==t) { ok=1; return; } int i; for(i=0;i<4;i++) { int tx=x+op[i][0]; int ty=y+op[i][1]; int tstep=step+1; //printf("%d %d %d\n",tx,ty,tstep); if(isok1(tx,ty,tstep)) { vis[tx][ty]=1; dfs(tx,ty,tstep); vis[tx][ty]=0; } } } int main() { int i,j,k; while(scanf("%d%d%d",&n,&m,&t)!=EOF) { if(n==0&&m==0&&t==0) break; ok=0; memset(vis,0,sizeof(vis)); for(i=0;i<n;i++) { scanf("%s",mat[i]); for(j=0;j<m;j++) { if(mat[i][j]==‘S‘) { sx=i;sy=j; } else if(mat[i][j]==‘D‘) { ex=i;ey=j; } } } if(isok1(sx,sy,0)) { vis[sx][sy]=1; dfs(sx,sy,0); } if(ok==0) { printf("NO\n"); } else printf("YES\n"); } return 0; }
HDU 1010 Tempter of the Bone (dfs)
标签:
原文地址:http://www.cnblogs.com/sola1994/p/4678966.html