点击打开链接
分析:
BFS,DFS,都可以,只要拍注意剪枝就可以了。
注意题目中要求只能在T秒到D。
题目中有坑。测试数据中每行有多余的空格。。。就这一点卡了一个晚上
#include"stdio.h" #include"string.h" #include"math.h" #define zz 10 int mark[zz][zz]; char map[zz][zz]; int n,m,t,s,e,ss,ee,f; int dir[4][2]={1,0,0,1,-1,0,0,-1}; void dfs(int x,int y,int t) { int i,dis; int xx,yy; if(x==ss&&y==ee) { if(t==0)f=1; return ; } if(f==1)return ; dis=abs(x-ss)+abs(y-ee); if(dis>t||(t-dis)%2!=0)return ; for(i=0;i<4;i++) { xx=x+dir[i][0]; yy=y+dir[i][1]; if(xx>=0&&xx<n&&yy>=0&&yy<m&&!mark[xx][yy]&&map[xx][yy]!='X') { mark[xx][yy]=1; dfs(xx,yy,t-1); mark[xx][yy]=0; } } } int main() { int i,j,k; while(scanf("%d %d %d%*c",&n,&m,&t)!=-1&&(n+m+t)) { k=0; memset(map,0,sizeof(map)); memset(mark,0,sizeof(mark)); for(i=0;i<n;i++) { for(j=0;j<m;j++) { scanf("%c",&map[i][j]); if(map[i][j]=='S') s=i,e=j; if(map[i][j]=='D') ss=i,ee=j,k++; if(map[i][j]=='.') k++; } scanf("%*c"); } if(k<t) { printf("NO\n"); continue; } f=0; mark[s][e]=1; dfs(s,e,t); if(f==1)printf("YES\n"); else printf("NO\n"); } return 0; }