真正搜索意义上的第一题、
开始因为标志变量flag没有重置为0、
导致WA了两次呢、吸取教训了
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 using namespace std; 6 int flag,di,dj,n,m,t; 7 char map[10][10]; 8 int dir[4][2]={{1,0},{0,1},{0,-1},{-1,0}}; 9 void dfs(int si,int sj,int cnt) 10 { 11 if(si<1||sj<1||si>n||sj>m) return; 12 if(cnt==t&&si==di&&sj==dj) flag=1; 13 if(flag) return; 14 int temp=t-cnt-(abs(si-di)+abs(sj-dj)); 15 if(temp<0||temp&1) return; //这里temp&1 还不清楚是什么意义... 有哪位大神可以告诉我吗 16 for(int i=0;i<4;++i){ 17 if(map[si+dir[i][0]][sj+dir[i][1]]!='X'){ 18 map[si+dir[i][0]][sj+dir[i][1]]='X'; 19 dfs(si+dir[i][0],sj+dir[i][1],cnt+1); 20 map[si+dir[i][0]][sj+dir[i][1]]='.'; 21 } 22 } 23 return; 24 } 25 int main() 26 { 27 while(cin >> n >> m >> t && m&&n&&t){ 28 flag=0; 29 int si,sj; 30 int wall=0; 31 for(int j,i=1;i<=n;++i){ 32 for(j=1;j<=m;++j){ 33 cin >> map[i][j]; 34 if(map[i][j]=='X') ++wall; 35 else if(map[i][j]=='D') {di=i;dj=j;} 36 else if(map[i][j]=='S'){si=i;sj=j;} 37 } 38 } 39 if(n*m-wall<=t){ //还有这里为什么不是小于t 40 cout << "NO" << endl; 41 continue; 42 } 43 map[si][sj]='X'; 44 dfs(si,sj,0); 45 if(flag) cout << "YES" << endl; 46 else cout << "NO" << endl; 47 } 48 return 0; 49 }