//我刚开始竟然用bfs做,不断的wa,bfs是用来求最短路的而这道题是求固定时间的 //剪纸奇偶剪枝加dfs #include<stdio.h> #include<queue> #include<math.h> #include<string.h> using namespace std; #define N 10 char ma[N][N]; struct node { int x,y,step; }ss,tt; int dis[4][2]={1,0,-1,0,0,1,0,-1},n,m,t; int vis[N][N]; int judge(int x,int y) { if(ma[x][y]!='X'&&x>=1&&x<=n&&y>=1&&y<=m&&!vis[x][y])//刚开始这里少些!vis[x][y]导致wa return 1; return 0; } int dfs(int x,int y,int step) { int xx,yy,st,i; if(ma[x][y]=='D'&&step==t)return 1; if(step>=t) return 0; for(i=0;i<4;i++) { xx=x+dis[i][0]; yy=y+dis[i][1]; st=step+1; if(judge(xx,yy)) { vis[xx][yy]=1; if(dfs(xx,yy,st))return 1; vis[xx][yy]=0; } } return 0; } int main() { int i,j,k; while(scanf("%d%d%d",&n,&m,&t),n||m||t) { for(i=1;i<=n;i++) scanf("%s",ma[i]+1); k=0; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(ma[i][j]=='S') { ss.x=i; ss.y=j; } if(ma[i][j]=='D') { tt.x=i; tt.y=j; } if(ma[i][j]=='X') k++; } if(n*m-k<t||(((int)fabs(tt.x-ss.x)+(int)fabs(tt.y-ss.y))%2!=t%2)) { printf("NO\n"); continue; } memset(vis,0,sizeof(vis)); vis[ss.x][ss.y]=1; if(dfs(ss.x,ss.y,0)) printf("YES\n"); else printf("NO\n"); } return 0; }
时间: 2024-10-11 00:27:28