- #include<iostream>
using namespace std;
int n,m,a1,a[25][25],b1,cnt,ans,x,y;
bool f,b[25][25];
int dir[5][2]={{0},{-1,0},{0,-1},{1,0},{0,1}};
void dfs(int A,int B){
if(A==x&&B==y){
if(ans==cnt){
f=true;
return ;
}
}
for(int i=1;i<=4;i++){
int nx=A+dir[i][0],ny=B+dir[i][1];
if(nx>=1&&nx<=m&ny>=1&&ny<=n&&!(a[nx][ny]==-1)&&!b[nx][ny]){
b[nx][ny]=true;
if(a[nx][ny]==1)ans++;
dfs(nx,ny);
}
}
}
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
if(a[i][j]==1)cnt++;
if(a[i][j]==2)a1=i,b1=j;
if(a[i][j]==3)x=i,y=j;
}
}
b[a1][b1]=true;
dfs(a1,b1);
if(f==true)cout<<"yes";
else cout<<"no";
return 0;
}90分
李素妍在2021-08-10 16:45:00追加了内容
顶
#include<bits/stdc++.h>//把你的ans去掉,
using namespace std;
int a[25][25],m,t,sx,sy,ex,ey,cnt,n;
bool vis[25][25],flag;
int dir[9][2]={{-1,0},{1,0},{0,-1},{0,1}};
int b[25][25];
void dfs(int x,int y,int k){//往函数里再传个参,代表你的ans
//cout<<x<<" "<<y<<endl;
if(flag) return ;
if(x==ex&&y==ey){
if(k==cnt)
flag=1;
return ;
}
for(int i=0;i<4;i++){
int nx=x+dir[i][0],ny=y+dir[i][1];
if(nx>=1&&nx<=m&&ny>=1&&ny<=n&&a[nx][ny]==0&&vis[nx][ny]==0){
vis[nx][ny]=1;
if(b[nx][ny]==1)
dfs(nx,ny,k+1);//这样就可以更新参数了·
else
dfs(nx,ny,k);
vis[nx][ny]=0;
}
}
}
int main(){
cin>>m>>n;
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
cin>>b[i][j];
if(b[i][j]==-1) a[i][j]=1;
if(b[i][j]==2){
sx=i;
sy=j;
}
if(b[i][j]==3){
ex=i;
ey=j;
}
if(b[i][j]==1){
cnt++;
}
}
}
vis[sx][sy]=1;
dfs(sx,sy,0);//记得归0
if(flag) cout<<"yes";
else cout<<"no";
return 0;
}