写的有点艰难。。。 /* dfs 判断结束条件 * 1,已经播好。 * 2,石头 * 3,越界 * 4,全部播完。 * 播的种子其实可以看作石头。 * * */ #include <stdio.h> #include <string.h> #include <iostream> #define MAX 1000 int done; int n,m; int flag; using namespace std; char map[MAX][MAX]; void dfs(int i,int j) { if(i>=n || j>=m || i<0 || j<0) return ; if(map[i][j] == 'S') return ; map[i][j] = 'S'; done++; if(done>=n*m) { flag = 1; return ; } /*int ii,jj; for( ii=0;ii<m;ii++) { for(jj=0;jj<n;jj++) cout<<map[ii][jj]; cout<<endl; } cout<<endl; */ dfs(i-1,j); dfs(i,j-1); dfs(i,j+1); dfs(i+1,j); //cout<<done<<endl; done--; map[i][j] ='.'; } int main(void) { while(scanf("%d %d",&n,&m)!=EOF) { if(n==0&&m==0) break; done = 0; // 记录被播种和石头的总数; for(int i=0;i<n;i++) { getchar(); for(int j=0;j<m;j++) { scanf("%c",&map[i][j]); if(map[i][j] == 'S') done++; } } flag = 0; dfs(0,0); if(flag) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }