进食后人
查看原帖
进食后人
571779
liankunxiang楼主2025/7/24 09:47
#include<bits/stdc++.h>
#define MAX_N 35
using namespace std;
int n;
int f[4][2]={{1,0},{0,1},{-1,0},{0,-1}};
int mp[MAX_N][MAX_N],vis[MAX_N][MAX_N],cnt=0;
bool flag[MAX_N*MAX_N];//大小要开对
void bfs(int sx,int sy) {
    vis[sx][sy]=cnt;
    queue<pair<int,int>>que;
    que.push({sx,sy});
    while(!que.empty()) {
        int now_x=que.front().first,now_y=que.front().second;
        que.pop();
        for(int i=0;i<4;i++) {
            int next_x=now_x+f[i][0],next_y=now_y+f[i][1];
            if(next_x<1||next_x>n||next_y<1||next_y>n) {
                flag[cnt]=false;
                continue;
            }
            if(vis[next_x][next_y]||mp[next_x][next_y]==1) {
                continue;
            } 
            vis[next_x][next_y]=cnt;
            que.push({next_x,next_y});
        }
    }
}
int main() {
    cin>>n;
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            cin>>mp[i][j];
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            if(vis[i][j]==0&&mp[i][j]!=1) {
                cnt++;
                flag[cnt]=true;
                bfs(i,j);
            } 
        }
    }
    for(int i=1;i<=n;i++) {
        for(int j=1;j<=n;j++) {
            if(mp[i][j]==1) {
                cout<<1<<" ";
            }else if(flag[vis[i][j]]) {
                cout<<2<<" ";
            }else {
                cout<<0<<" ";
            }
        }
        cout<<endl;
    }
    fclose(stdin);
    fclose(stdout);
    return 0;
}

如果像我一样使用 flag 数组进行标记是否为闭合圈内的0的连通块,一定要开对大小!

2025/7/24 09:47
加载中...