zoukankan      html  css  js  c++  java
  • 涂色(题解)

    题目描述

    由数字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 

     

    输入

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

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

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

    输出

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

    样例输入

    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≤n≤30 


     

    思路:

        这道是一道入门的搜索题。主要是区分'1'的边界以内的东西(也就是说染色,染成'2').(深搜/广搜)

      在图上搜索一点会有固定的走法,一定的状态。就举一个栗子(设当前状态为i,j),那么i-1,j等就可以了。

      

    dfs(p-1,q);
    dfs(p+1,q);
    dfs(p,q-1);
    dfs(p,q+1);
    

      

      加上越界就没问题了。

      

    if (p<0||p>n+1||q<0||q>n+1||a[p][q]) return;

    再判断数组状态输出即可。

    for (i=1; i<=n; i++)
    		for (j=1; j<=n; j++) {
    			cin>>b[i][j];
    			if (b[i][j]==0) a[i][j]=0;
    			else a[i][j]=2;
    		}
    	dfs(0,0);
    	for (i=1; i<=n; i++) {
    		for (j=1; j<=n; j++)
    			if (a[i][j]==0) cout<<2<<' ';
    			else cout<<b[i][j]<<' ';
    		cout<<'
    ';
    	}

    参考深搜代码:

    #include <bits/stdc++.h>//万能头
    using namespace std;
    int a[32][32],b[32][32];
    int n,i,j;
    void dfs(int p,int q) {
    	int i;
    	if (p<0||p>n+1||q<0||q>n+1||a[p][q]) return;//边界
    	a[p][q]=1;
    	dfs(p-1,q);//状态
    	dfs(p+1,q);
    	dfs(p,q-1);
    	dfs(p,q+1);
    }
    int main() {
    	cin>>n;
    	for (i=1; i<=n; i++)
    		for (j=1; j<=n; j++) {
    			cin>>b[i][j];
    			if (b[i][j]==0) a[i][j]=0;//预处理
    			else a[i][j]=2;
    		}
    	dfs(0,0);
    	for (i=1; i<=n; i++) {
    		for (j=1; j<=n; j++)
    			if (a[i][j]==0) cout<<2<<' ';//判断
    			else cout<<b[i][j]<<' ';
    		cout<<'
    ';
    	}
    	return 0;//好习惯
    }
    

     OVER!

                        ——2019.04.07

  • 相关阅读:
    python常用模块(3)
    python中的re模块
    python中的常用模块
    python中的模块及路径
    python中的文件操作(2)
    【weixin】微信支付简介
    【其他】博客园样式修改
    【weixin】微信企业号和公众号区别和关系是什么?
    【其他】./ 和../ 以及/区别
    【sdudy】ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了
  • 原文地址:https://www.cnblogs.com/wangshengjun/p/10666840.html
Copyright © 2011-2022 走看看