32分求条QAQ

P1162 填涂颜色

DENGZIAO @ 2024-10-22 15:45:55

#include<bits/stdc++.h>
using namespace std;
int a[40][40];
bool vis[40][40];
int tx[4]={0,0,1,-1};
int ty[4]={1,-1,0,0};
int n,m;
struct node{
    int x;
    int y;
};
queue<node>q;

void bfs(int x,int y){
    int fx,fy;
    vis[x][y]=1;
    q.push((node){x,y});
    while(!q.empty()){
        vis[q.front().x][q.front().y]=1;
        for(int i=0;i<4;i++){
            fx=q.front().x+tx[i],fy=q.front().y+ty[i];
            if(!vis[fx][fy]&&fx>=0&&fx<=n&&fy>=0&&fy<=n&&a[fx][fy]!=1){
                q.push((node){fx,fy});

            }
        }
        q.pop();
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(!vis[i][j]) a[i][j]=2;
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
}

int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
            if(a[i][j]) vis[i][j]=true;
        }
    }
    bfs(0,0);

    return 0;
}

by tengyuxuan @ 2024-11-09 21:56:33

include <bits/stdc++.h>

using namespace std; int n; int b[35][35],a[35][35]; void dfs(int x,int y){ if(x<0||y<0||y>=n+2||x>=n+2||a[x][y]!=0)return; a[x][y]=1; dfs(x+1,y); dfs(x-1,y); dfs(x,y-1); dfs(x,y+1); } int main(){ cin>>n; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ cin>>b[i][j]; if(b[i][j]==1)a[i][j]=3; } } dfs(0,0); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(a[i][j]==0){ cout<<2<<' '; }else{ cout<<b[i][j]<<' '; } } cout<<endl; } return 0; }```cpp

```cpp
#include <bits/stdc++.h>
using namespace std;
int n;
int b[35][35],a[35][35];
void dfs(int x,int y){
    if(x<0||y<0||y>=n+2||x>=n+2||a[x][y]!=0)return;
    a[x][y]=1;
    dfs(x+1,y);
    dfs(x-1,y);
    dfs(x,y-1);
    dfs(x,y+1); 
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>b[i][j];
            if(b[i][j]==1)a[i][j]=3;
        }
    }
    dfs(0,0);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            if(a[i][j]==0){
                cout<<2<<' ';
            }else{
                cout<<b[i][j]<<' ';
            }
        }
        cout<<endl;
    }
    return 0;
}

by tengyuxuan @ 2024-11-09 21:58:51

#include <bits/stdc++.h>
using namespace std;
int mp[40][40];
bool vis[40][40];//标识哪些点被访问过,如果被访问过则标识为1,否则为0
int n; 
int fx[5]={0,0,1,0,-1};//行方向数组 
int fy[5]={0,1,0,-1,0};//列方向数组 
struct node{
    int x;//行值 
    int y;//列值 
};
queue<node> q;//定义队列q 
int main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>mp[i][j];
        }
    }
    //开始广搜:从(0,0)开始:
    node sp;//定义初始队首元素 
    sp.x=0;
    sp.y=0;
    q.push(sp);//将队首元素sp压入队列q中
    //开始广搜(bfs)
    while(!q.empty()){
        //每次都以队首元素为基准点进行四个方向探索
        node qf=q.front();//取出队首元素 
        int bx,by;
        bx=qf.x;
        by=qf.y;
        for(int i=1;i<=4;i++){
            int nx,ny;
            nx=bx+fx[i];
            ny=by+fy[i];
            if(nx>=0&&nx<=n+1&&ny>=0&&ny<=n+1&&mp[nx][ny]==0&&!vis[nx][ny]){
                vis[nx][ny]=1;
                node np;//定义新点 
                np.x=nx;
                np.y=ny;
                q.push(np);//将新点压入队列 
            }
        } 
        q.pop();//将队首元素弹出 
    } 
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            //没有被访问过,而且是0的点,改为2 : 
            if(vis[i][j]==0&&mp[i][j]==0){
                cout<<2<<' ';
                //其余的点输出原值即可: 
            }else{
                cout<<mp[i][j]<<' ';
            }
        }
    }
    return 0;
}

|