原本因为简单的dfs就可以 写完却发现不知道如何保留一条路的路径 不能保证一条路中的节点只被走一次 导致死循环
还有各种剪枝
代码算是跟别人一个模子刻出来的 递归 一直走那一条路 走过就标记上 回溯的时候再取消标记
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 int k,d,num,flag,n,m,t,a[6]; 6 char c[10][10]; 7 void dfs(int x, int y) 8 { 9 int Min; 10 if(flag==1||x == 0||x >n||y>m||y==0||c[x][y]=='X') 11 return; 12 if(c[x][y]=='D'&&num==t) 13 { 14 flag=1; 15 return; 16 } 17 Min=abs(x-a[0])+abs(y-a[1]); 18 if(num+Min>t||(num-t-Min)%2!=0) 19 return; 20 if(c[x][y]!='D') 21 c[x][y]='X'; 22 num++; 23 dfs(x+1,y); 24 dfs(x,y+1); 25 dfs(x-1,y); 26 dfs(x,y-1); 27 if(c[x][y]!='D') 28 c[x][y]='.'; 29 num--; 30 } 31 int main() 32 { 33 int i, j,count,x,y; 34 while(scanf("%d%d%d%*c", &n, &m, &t)!=EOF) 35 { 36 if(n == 0&&m == 0&&t == 0) 37 break; 38 k = 0; 39 d = 0; 40 count = 0; 41 flag = 0; 42 for(i = 1 ; i <= n ; i++) 43 { 44 c[i][0] = '*'; 45 c[i][m+1] = '*'; 46 for(j = 1 ; j <= m ; j++) 47 { 48 c[0][j] = '*'; 49 c[n+1][j] = '*'; 50 scanf("%c", &c[i][j]); 51 if(c[i][j] == 'S') 52 { 53 x = i; 54 y = j; 55 num = 0; 56 } 57 if(c[i][j] == 'D') 58 { 59 a[0] = i; 60 a[1] = j; 61 } 62 if(c[i][j]=='X') 63 count++; 64 } 65 getchar(); 66 } 67 if(n*m-count>t) 68 { 69 dfs(x,y); 70 } 71 if(flag == 1) 72 printf("YES\n"); 73 else 74 printf("NO\n"); 75 } 76 return 0; 77 }