问题标题: 酷町堂:4960

0
0
已解决
李素妍
李素妍
新手天翼
新手天翼
  • #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追加了内容


0
0
0
车轩立
车轩立
资深守护
资深守护

#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;
}

0
0
张恩泽
张恩泽
高级天翼
高级天翼

这题需要一个check函数,判断能不能走出来,然后再dfs

bool check() {
    for (int i = 1; i <= m; i ++) {
        for (int j = 1; j <= n; j ++) {
            if (G[i][j] == 1 && !vis[i][j]) {
                return false;
            }
        }
    }
    return true;
}

 

我要回答