问题标题: 酷町堂:13233

0
0
已解决
高驰宇
高驰宇
初级光能
初级光能

#include<iostream> using namespace std; int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}}; bool g[15][15],vis[15][15]; int cnt,n; void dfs(int x,int y){ for(int i=0;i<4;i++){ int nx=x+dir[i][0]; int ny=y+dir[i][1]; if(nx>=0&&nx<=n&&ny>=0&&ny<=n&&g[nx][ny]==0&&vis[nx][ny]==0){ vis[nx][ny]=1; dfs(nx,ny); } } return ; } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>g[i][j]; } } vis[0][0]=1; dfs(0,0); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(g[i][j]==0&&vis[i][j]==0){ cnt++; } } } cout<<cnt; return 0; }//10分

高驰宇在2025-07-24 10:50:24追加了内容
#include<iostream>
using namespace std;
int dir[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
bool g[15][15],vis[15][15];
int cnt,n;
void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int nx=x+dir[i][0];
        int ny=y+dir[i][1];
        if(nx>=0&&nx<=n&&ny>=0&&ny<=n&&g[nx][ny]==0&&vis[nx][ny]==0){
            vis[nx][ny]=1;
            dfs(nx,ny);
        }
    }
    return ;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>g[i][j];
        }
    }
    vis[0][0]=1;
    dfs(0,0);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(g[i][j]==0&&vis[i][j]==0){
                cnt++;
            }
        }
    }
    cout<<cnt;
    return 0;
}

 


0
已采纳
彭志杰
彭志杰
中级天翼
中级天翼

错误的地方:

1. 第10行,应该是nx>=1和ny>=1,注意边界;

2. 第24~25行,这样直接vis[0][0]=1并调用dfs(0,0)显然是错的,做法:

第一个循环:

遍历i:1~n;
判断边界g[i][1]、vis[i][1]是否都为0,是的话就从边界调用dfs(i,1)
判断边界g[i][n]、vis[i][n]是否都为0,是的话就从边界调用dfs(i,n)

那么第二个循环(不嵌套在i:1~n中)

j:1~n

跟上面一样判断边界是否能走、没有被vis访问过,就做边界调用操作,只是要把dfs的调用改成dfs(1, j) dfs(n, j)而已。

0
彭志杰
彭志杰
中级天翼
中级天翼

@高驰宇 

点击这个按钮

把你的错误代码放进去

之后点右下角确定,之后发出来

0
裴俊坤
裴俊坤
修练者
修练者

函数部分

void dfs(int x,int y){
    for(int i=0;i<4;i++){
        int dx=x+dir[i][0],dy=y+dir[i][1];
        if(dx>=0&&dx<=n+1&&dy>=0&&dy<=n+1&&a[dx][dy]==0&&!vis[dx][dy]){
            vis[dx][dy]=true;
            dfs(dx,dy);
        }
    }
}

主函数

 vis[0][0]=true;
    dfs(0,0);
    int cnt=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(a[i][j]==0&&!vis[i][j]){
                cnt++;
            }
        }
    }

定义和输入输出自己写

0
0
我要回答