Tania2013 @ 2024-06-09 18:20:52
#include<bits/stdc++.h>
using namespace std;
int x[4]={0,0,1,-1},y[4]={1,-1,0,0};
char a[110][110];
int n,m,vis[105][105];
int flag=0;
void dfs(int x1, int y1)
{
if(x1==n && y1==m)
{
flag=1;
return;
}
for(int i=1;i<=4;i++)
{
int x2=x1+x[i],y2=y1+y[i];
if (x2>=1 && x2<=n && y2>=1 && y2<=m && a[x2][y2]=='.' && vis[x2][y2]==0)
{
vis[x2][y2]=1;
dfs(x2,y2);
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j];
}
}
vis[1][1]=1;
dfs(1,1);
if(flag)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
return 0;
}
by renzhanwen @ 2024-06-09 18:32:07
@Tania2013 第20行后面要加vis[x2][y2]=0;这段代码,否则这个dfs是没法走第一次走过的路的,这样是在清除标记。求关!!!
by Prodige @ 2024-06-09 18:34:36
你深搜时的遍历下标错了
for(int i=1;i<=4;i++) //这里
{
int x2=x1+x[i],y2=y1+y[i];
if (x2>=1 && x2<=n && y2>=1 && y2<=m && a[x2][y2]=='.' && vis[x2][y2]==0)
{
vis[x2][y2]=1;
dfs(x2,y2);
}
}
应该改成这样
for(int i=0;i<4;i++) //this
{
int x2=x1+x[i],y2=y1+y[i];
if (x2>=1 && x2<=n && y2>=1 && y2<=m && a[x2][y2]=='.' && vis[x2][y2]==0)
{
vis[x2][y2]=1;
dfs(x2,y2);
}
}
by Tania2013 @ 2024-06-09 19:06:44
谢谢