• 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

    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 #include<iostream>
     2 #include<queue>
     3 using namespace std;
     4 int a[31][31];
     5 bool visited[31][31];
     6 int n;
     7 struct pos{
     8     int x;
     9     int y;
    10     pos(int xx, int yy):x(xx), y(yy){}
    11 };
    12 bool check(int x, int y){
    13     if(x>=1&&x<=n&&y>=1&&y<=n&&a[x][y]!=1&&visited[x][y]==false)
    14         return true;
    15     return false;
    16 }
    17 void print(){
    18     int i, j;
    19     for(i = 1; i <= n; i++){
    20         for(j = 1; j <= n; j++){
    21             cout<<a[i][j]<<" ";
    22         }
    23         cout<<endl;
    24     }
    25     cout<<endl;
    26 }
    27 void floodfill(int x, int y){
    28     queue<pos>q;
    29     q.push(pos(x,y));
    30     while(!q.empty()){
    31         pos temp = q.front();
    32         if(check(temp.x+1, temp.y))
    33             q.push(pos(temp.x+1, temp.y));
    34         if(check(temp.x-1, temp.y))
    35             q.push(pos(temp.x-1, temp.y));
    36         if(check(temp.x, temp.y+1))
    37             q.push(pos(temp.x, temp.y+1));
    38         if(check(temp.x, temp.y-1))
    39             q.push(pos(temp.x, temp.y-1));
    40         a[temp.x][temp.y] = 0;    
    41         visited[temp.x][temp.y]=true; q.pop();
    42     }
    43     return;
    44 }
    45 int main(){
    46     cin>>n;
    47     int i, j, x;
    48     for(i = 1; i <= n; i++)
    49         for(j = 1; j <= n; j++){
    50             cin>>x;
    51             if(x==0) a[i][j] = 2;
    52             else a[i][j] = 1;    
    53         }
    54     for(i = 1; i <= n; i++){
    55         if(check(1, i))
    56             floodfill(1, i);
    57         if(check(n, i))
    58             floodfill(n, i);
    59     }
    60         
    61     for(i = 1; i <= n; i++){
    62         if(check(i, 1))
    63             floodfill(i, 1);
    64         if(check(i, n))
    65             floodfill(i, n);
    66     }    
    67     print();    
    68     return 0;
    69 } 

    备注:

    BFS水题,看了解析才知道了一个小技巧。最开始把所有的0填充成2,然后从边界开始bfs,从边界能走到的地方都标回0。

    打了一下午牌就做了这一道题,明天比区赛……我抓紧时间去抱佛脚了。

  • 相关阅读:
    SharePoint母板页更改
    SharePoint的一些基本操作
    百度地图
    内存管理
    根据文字的个数,label自动适应高度
    navgationBar
    接收服务器上的图片,可以用webview或者 imageview
    iOS 自带的解析json的类。
    改变uilable uibutton等的字体颜色、大小。
    Nsstring和NSdata的编码转换
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/5877496.html
Copyright © 2020-2023  润新知