填涂颜色

P1162 填涂颜色

P1162 填涂颜色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目描述

由数字00组成的方阵中,有一任意形状闭合圈,闭合圈由数字11构成,围圈时只走上下左右44个方向。现要求把闭合圈内的所有空间都填写成22.例如:6 \times 66×6的方阵(n=6n=6),涂色前和涂色后的方阵如下:

0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

输入格式

每组测试数据第一行一个整数n(1 \le n \le 30)n(1n30)

接下来nn行,由00和11组成的n \times nn×n的方阵。

方阵内只有一个闭合圈,圈内至少有一个00。

//感谢黄小U饮品指出本题数据和数据格式不一样. 已修改(输入格式)

输出格式

已经填好数字22的完整方阵。

输入输出样例

输入 #1
6
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 0 0 1
1 1 0 0 0 1
1 0 0 0 0 1
1 1 1 1 1 1
输出 #1
0 0 0 0 0 0
0 0 1 1 1 1
0 1 1 2 2 1
1 1 2 2 2 1
1 2 2 2 2 1
1 1 1 1 1 1

说明/提示

1 \le n \le 301n30

这题有点坑,就是如果墙壁把数字围起来,那那么多外围的0形成不了一个连通块,那就搜索不到全部了,问题就出在这里

6
0 0 1 1 1 0
1 1 1 0 1 0
1 0 0 0 0 1
1 1 0 1 1 1
0 1 0 1 0 0
0 1 1 1 0 0

就是这个样例

那怎么办呢

问题的关键就是想让所有的0变成一个连通块,那就变呗...扩大一圈,那必定连通,然后开始搜索

复制代码
#include<iostream>
using namespace std;
const int N=50;
int a[N][N];
int n;
int dx[5]={0,-1,1,0,0};
int dy[5]={0,0,0,-1,1};
void dfs(int x,int y)
{
    if(x<0||y<0||x>n+1||y>n+1||a[x][y]==1||a[x][y]==0)
        return ;
    a[x][y]=0;
    for(int i=1;i<=4;i++)
        dfs(x+dx[i],y+dy[i]);
}
int main(){
    cin>>n;
    for(int i=0;i<=n+1;i++)
    {
        a[i][0]=2;
        a[i][n+1]=2;
        a[0][i]=2;
        a[n+1][i]=2; 
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            cin>>a[i][j];
            if(!a[i][j]) a[i][j]=2;
        }
    }
/*    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
*/ 
    dfs(0,0);//从1,1点开始搜
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
            cout<<a[i][j]<<" ";
        cout<<endl;
    }
    return 0;
     
}
复制代码
复制代码
#include<iostream> 
using namespace std;
const int N=50;
int a[N][N]; 
int n;
void dfs(int x,int y)
{
    if(x<0||y<0||x>n+1||y>n+1||a[x][y]||a[x][y]==-1)
        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>>a[i][j];
    dfs(0,0);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(a[i][j]==-1)
                cout<<"0 ";
            if(!a[i][j])
                cout<<"2 ";
            if(a[i][j]==1)
                cout<<"1 ";
        }
        cout<<endl;
    }
    return 0;
}
复制代码

bfs:

复制代码
#include<iostream>
#include<queue>
using namespace std;
typedef pair<int,int> PAII;//存坐标 
int n;
const int N=50;
int s[N][N];
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
void bfs(int x,int y)
{
    queue<PAII> q;
    q.push({x,y});
    while(q.size())
    {
        auto t=q.front();
        q.pop();
        int a=t.first,b=t.second;
        for(int i=0;i<4;i++)
        {
            int x1=a+dx[i];
            int y1=b+dy[i];
            if(x1>=0&&y1>=0&&x1<=n+1&&y1<=n+1&&!s[x1][y1])
            {
                q.push({x1,y1});
                s[x1][y1]=3;
            }
            
        }
    }
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++)
            cin>>s[i][j];
    bfs(0,0);//扩大一圈 
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(s[i][j]==3) cout<<"0 ";
            else if(!s[i][j]) cout<<"2 ";
            else cout<<s[i][j]<<" ";
        }
        cout<<endl;
    }
} 
复制代码

 

posted @   小志61314  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示