DFS+奇偶剪枝...
题目刚开始理解错误,一位只要在t时间内到达门就OK,但是却...后来去查了下才知道只能在t时刻到门才能逃出去...倒霉的狗狗
#include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> struct node { int x,y; }p[3]; int n,m,t,ff; int vist[100][100]; int f[4][2]={0,1,0,-1,1,0,-1,0}; int CutBranch(int i, int j) { return abs(i - p[2].x) + abs(j - p[2].y); } int DFS(int xx,int yy,int T) { int a = CutBranch(xx, yy); if((a & 1) != ((t - T) & 1) || a > t - T) return 0; if (T==t && ((xx!=p[2].x) || (yy!=p[2].y))) return ff; if ((xx==p[2].x) && (yy==p[2].y) && (T==t)) { ff=1; return ff; } for (int i=0;i<4;i++) { int xxx=xx+f[i][0]; int yyy=yy+f[i][1]; if ((!vist[xxx][yyy]) && (xxx>0) && (xxx<=n) && (yyy<=m) && (yyy>0)) { vist[xxx][yyy]=1; T++; DFS(xxx,yyy,T); if (ff) return 1; T--; vist[xxx][yyy]=0; } } } int main() { while (~scanf("%d%d%d",&n,&m,&t)&&(n+m+t)) { int tt=0; memset(vist,0,sizeof(vist)); getchar(); for (int i=1;i<=n;i++) { for (int j=1;j<=m;j++) { char c; scanf("%c",&c); if (c=='S') { p[1].x=i; p[1].y=j; vist[i][j]=1; } if (c=='D') { p[2].x=i; p[2].y=j; } if (c=='X') { vist[i][j]=1; tt++; } } getchar(); } ff=0; if (t>n*m-tt) puts("NO"); else { DFS(p[1].x,p[1].y,0); if (ff==0) printf("NO\n"); else printf("YES\n"); } } return 0; }