给出一个地图,X标记不可走,D表示门,S表示起点,每次走上下左右走一个点,问你在所给的时间,刚好走到D么?并且每个点不能重复走
最近看了不少DFS,感觉没神马长进啊........
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> #include <math.h> #include <queue> using namespace std; char map[10][10]; int n,m,Time,flag,aa,bb; int dir[][2] = {{0,1},{0,-1},{1,0},{-1,0}}; int used[10][10]; int t; void DFS(int a,int b) { if(flag)return ; int dis,x,y; dis=abs(a-aa)+abs(b-bb); if(dis>Time-t)return ; if(dis%2!=(Time-t)%2)return ; if(t==Time&&map[a][b]=='D'){flag=true;return;} for(int i=0;i<4;i++) { int x=a+dir[i][0],y=b+dir[i][1]; if(x>=0&&x<n&&y>=0&&y<m&&!used[x][y]&&map[x][y]!='X') { t++; used[x][y]=1; DFS(x,y); t--; used[x][y]=0; } } } int main() { int len,i,k,a,b; while( scanf("%d%d%d",&n,&m,&Time) && ( n || m || Time ) ) { int wall = 0; for(k=0; k<n; k++) { scanf("%s",map[k]); for(i=0; i<m; i++) { if( map[k][i] == 'S' ) { a = k; b = i; } if( map[k][i] == 'D' ) { aa = k; bb = i; } if( map[k][i] == 'X' ) wall++; } } if( n*m-wall-1 < Time || abs(a-aa) + abs(b-bb) > Time ) { printf("NO\n"); continue; } flag = t = 0; memset(used,0,sizeof(used)); used[a][b] = 1; DFS(a,b); if( flag == 1 ) printf("YES\n"); else printf("NO\n"); } return 0; }