1. 程式人生 > >P1162 填塗顏色 -洛谷

P1162 填塗顏色 -洛谷

P1162 填塗顏色

P1162 填塗顏色

題目描述

  由數字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。
  //感謝黃小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≤n≤30

解析

  要求在圖裡面找閉合圖形,反向思維,找沒有被1包圍的0.
  可知邊界必定沒有被包圍,就從四條邊開始找到0就bfs或者dfs嘩嘩譁就可以了.

#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<stdio.h>
#include<stdlib.h>
#include<map>
#ifndef NULL
#define
NULL 0
#endif using namespace std; struct vec { int x,y; }p{ -1,-1 }; int n,mp[31][31], dx[] = { 0,1,0,-1 }, dy[] = { 1,0,-1,0 }; void bfs() { queue<vec >q; q.push(p); while (!q.empty()) { p = q.front(); q.pop(); mp[p.x][p.y] = 3; for (int i = 0; i < 4; i++) { p.x += dx[i], p.y += dy[i]; if (!mp[p.x][p.y] && p.x >= 0 && p.x < n&&p.y < n&&p.y >= 0) q.push(p); p.x -= dx[i], p.y -= dy[i]; } } } int main() { cin >> n; for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) cin >> mp[i][j]; for (int i = 0; i < n; i++) { if (!mp[0][i]) { p.x = 0, p.y = i; bfs(); } if (!mp[n - 1][i]) { p.x = n - 1, p.y = i; bfs(); } if (!mp[i][0]) { p.x = i, p.y = 0; bfs(); } else if (!mp[i][n - 1]) { p.x = i, p.y = n - 1; bfs(); } } for(int i=0;i<n;i++){ for (int j = 0; j < n; j++) if (mp[i][j] == 3) cout << 0 << ' '; else if (mp[i][j] == 0) cout << 2 << ' '; else cout << mp[i][j] << ' '; cout << endl; } return 0; }