/*
解题思路:首先记录下'.'的个数count,接着每遍历成功一个单元格就num++,当count=num说明全部遍历成功。
因为此题从(0,0)开始,但是不知道什么位置停止,所以不能将坐标作为终止条件。
*/
#include<iostream>
using namespace std;
char map[100][100];
int book[100][100];
int m,n,count=0,num=0,flag=0;
int next[4][2]={{0,1},{0,-1},{-1,0},{1,0}};
void dfs(int x,int y)
{
int tx,ty,k;
if(num==count)
{
flag=1;
return ;
}
for(k=0;k<4;k++)
{
tx=x+next[k][0];
ty=y+next[k][1];
if(tx<0||tx>=n||ty<0||ty>=m)
continue;
if(map[tx][ty]!='S'&&book[tx][ty]==0)
{
num++;//访问一次就加一次
book[tx][ty]=1;//标记为走过
dfs(tx,ty);//进入下一层
book[tx][ty]=0;//取消标记,不可缺少
num--;//跳出一次就减一次,不可缺少
}
}
}
int main()
{
int i,j;
while(cin>>n>>m&&n&&m)
{
count=0;//对于循环输入的程序一定注意这些初始化放置在全局还是main中,重要!!之前失败的原因就是这个初始化
num=0;
flag=0;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
{
cin>>map[i][j];
if(map[i][j]=='.')
count++;
}
}
book[0][0]=1;
num++;
dfs(0,0);
if(flag)
cout<<"yes"<<endl;
else
cout<<"no"<<endl;
}
return 0;
}
zoj2100-Seeding
最新推荐文章于 2021-04-01 13:39:47 发布