P1162 填涂颜色 洛谷

题目描述

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

0 0 0 0 0 0 0 0 0 0 0 0

0 0 1 1 1 1 0 0 1 1 1 1

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

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

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

1 1 1 1 1 1 1 1 1 1 1 1

输入输出格式

输入格式:

每组测试数据第一行一个整数:n。其中n(1<=n<=30)

接下来n行,由0和1组成的nXn的方阵。

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

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

输出格式:

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

输入输出样例

输入样例#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<=n<=30

题解

相信刚刚看这个题的人都很懵逼,之后看了下题解 , 也没看懂别人的代码,主要就是一句话, 不用找圈内的2,只需要找圈外的0就好了

然后 这个题就变得和水池数目差不多了 = = 一个搜索的方法

#include<iostream>
#include<cmath>
#include <cstring>
using namespace std;
char d[50][50];
char p[50][50];
int dp[50][50];    //主要作用就是标记   ,加快下速度, 要保持好习惯
int n;
void dfs(int x,int y)    //和经典简单搜索的水池数目一样的搜索方法
{
    if(dp[x][y]==0) return ;
    dp[x][y]=0;
    p[x][y]=‘0‘;    //标记连在一起的0
    if(x+1>0&&y>0&&x+1<=n&&y<=n&&d[x+1][y]==‘0‘) dfs(x+1,y);
    if(x>0&&y-1>0&&x<=n&&y-1<=n&&d[x][y-1]==‘0‘) dfs(x,y-1);
    if(x-1>0&&y>0&&x-1<=n&&y<=n&&d[x-1][y]==‘0‘) dfs(x-1,y);
    if(x>0&&y-1>0&&x<=n&&y-1<=n&&d[x][y-1]==‘0‘) dfs(x,y-1);
}
int main()
{
    while(cin>>n)
    {
        memset(dp,1,sizeof(dp));
        memset(d,‘0‘,sizeof(d));
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cin>>d[i][j];
            }
        }
        memset(p,‘2‘,sizeof(p));     //主要就是这一步智商比较高
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(d[i][j]==‘1‘) p[i][j]=‘1‘;
            }
        }
        for(int i=0;i<=n+1;i++) dfs(0,i);            //四个循环  查四个临界的0, 然后搜圈外的0
        for(int i=0;i<=n+1;i++) dfs(i,0);
        for(int i=0;i<=n+1;i++) dfs(n+1,i);
        for(int i=0;i<=n+1;i++) dfs(i,n+1);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                cout<<p[i][j]<<‘ ‘;
            }
            cout<<endl;
        }
    }
} 
从边缘DFS,把圈外的0都记录下,最后没记录的就是圈内的0,不过一开始没想到。。。

#include<cstdio>
#include<iostream>
using namespace std;
int n,map[35][35],vis[35][35];//大小n*n,图,是否访问过
void dfs(int i,int j)//求联通块
{
    if(map[i][j] || vis[i][j] || i<1 ||i>n || j<1 || j>n)return;
    vis[i][j]=1;
    dfs(i-1,j);dfs(i+1,j);dfs(i,j+1);dfs(i,j-1);
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]);
//贪心,从边缘DFS一定能把所有外面的0都访问过
    for(int i=1;i<=n;i++){dfs(1,i);dfs(n,i);}
    for(int i=2;i<n;i++){dfs(i,1);dfs(i,n);}
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)if(map[i][j])printf("%d ",1); else printf("%d ",vis[i][j]?0:2);
        cout<<"\n";
    }
    return 0;
}
时间: 2024-10-13 12:36:36

P1162 填涂颜色 洛谷的相关文章

P1162 填涂颜色

P1162 填涂颜色 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 2 2 1 1 1 0 0 0 1 1 1 2 2 2 1 1 0 0 0 0 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1

Luogu P1162 填涂颜色(bfs)

P1162 填涂颜色 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=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

luogu P1162 填涂颜色

P1162 填涂颜色 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 2 2 1 1 1 0 0 0 1 1 1 2 2 2 1 1 0 0 0 0 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1

洛谷P1162 填涂颜色 解题报告

by MedalPluS 题目描述: 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和   涂色后的方阵如下:0 0 0 0 0 0      0 0 0 0 0 00 0 1 1 1 1      0 0 1 1 1 10 1 1 0 0 1      0 1 1 2 2 11 1 0 0 0 1      1 1 2 2 2 1 1 0 0 0 0 1      1 2 2

题解 P1162 【填涂颜色】

看到题目规模是n(1≤n≤30)即最大规模为30*30 本蒟蒻有个奇妙的想法!! 核心思路:搜索地图内除开被1包围着的0,并标注为1(即不填色) !!!那么,我们可以从每一个边界点开始去搜索 话不多说,直接上代码 #include<iostream> #include<cstdio> using namespace std; int n; int map[35][35]; int vis[35][35]; int mov1[]={1,0,0,-1}; int mov2[]={0,1

1162 填涂颜色

难度:普及- 题目类型:BFS 提交次数:5 涉及知识:BFS 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 2 2 1 1 1 0 0 0 1 1 1 2 2 2 1 1 0 0 0 0 1 1 2 2 2 2 1

填涂颜色

由数字0组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6×6的方阵(n=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 1 #include<io

洛谷P1162(自我感觉思路还算巧妙的一道题)

P1162 填涂颜色 题目描述 由数字0 组成的方阵中,有一任意形状闭合圈,闭合圈由数字1构成,围圈时只走上下左右4个方向.现要求把闭合圈内的所有空间都填写成2.例如:6X6的方阵(n=6),涂色前和涂色后的方阵如下: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 1 1 0 1 1 0 0 1 0 1 1 2 2 1 1 1 0 0 0 1 1 1 2 2 2 1 1 0 0 0 0 1 1 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1

洛谷——基础搜索

1.P1706 全排列问题 题目描述 输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字. 输入输出格式 输入格式: n(1≤n≤9) 输出格式: 由1-n组成的所有不重复的数字序列,每行一个序列.每个数字保留5个常宽. 输入输出样例 输入样例#1: 3 输出样例#1: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 (⊙v⊙)嗯~ 代码: #include<iostream> #include<cstdio> #