题意:求是否能从左上角一次性走完所有可以走的点
分析:我开始做的时候直接用的上一题的方法,结果全是YES,现在我好像知道了,DFS是会遍历完所有的点的,后来我改了之后又全是NO,我真是疯了。
最后看了别人的代码,唉唉唉,还是递归结束条件和回溯的问题,DFS还得练
代码:
#include<iostream>
#include<cstring>
using namespace std;
int n,m;
char a[10][10];
int d[4][2]={{0,-1},{0,1},{1,0},{-1,0}};
int flag;
int stone;
void dfs(int x,int y,int cn)
{
if((cn+stone)==m*n) {
flag=1;return;
}
for(int i=0;i<4;i++){
int dx=x+d[i][0];
int dy=y+d[i][1];
if(dx>0&&dx<=n&&dy>0&&dy<=m&&a[dx][dy]=='.'){
a[dx][dy]='S';
dfs(dx,dy,cn+1);
a[dx][dy]='.';
}
}
}
int main()
{
while(cin>>n>>m){
if(!n&&!m) break;
stone=0;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
cin>>a[i][j];
if(a[i][j]=='S') stone++;}
a[1][1]='S';flag=0;
dfs(1,1,1);
if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;
}
}