1、题目描述

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

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

2、输入格式

每组测试数据第一行一个整数n (搜索)P1162 填涂颜色 - 图4
接下来 n 行,由0和1组成的 (搜索)P1162 填涂颜色 - 图5 方阵。
方阵内只有一个闭合圈,圈内至少有一个0

3、输出格式

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

4、输入输出样例

输入

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

5、说明/提示

(搜索)P1162 填涂颜色 - 图6

6、思路

其实感觉这个题目难点就在于区分 边界0被包围的0 ,观察方阵可以知道,我们只需要找到出现的第一个1,那么由于是闭合圈,那么其右下角的那个元素一定会是0。之后我们就只需要从这个点开始向四个方向搜索就可以了,把合法的每一个点的值都变成数字2就可以了。

1、深度搜索

  1. #include <bits/stdc++.h>
  2. #define N 30
  3. using namespace std;
  4. int n = 0;
  5. int start_x,start_y;
  6. int a[N+1][N+1];
  7. bool book[N+1][N+1];
  8. int _next[4][2] = {{-1,0},{1,0},{0,-1},{0,1}};
  9. void dfs(int x,int y){
  10. int next_x,next_y;
  11. a[x][y] = 2;
  12. for(int i = 0;i < 4;i++){
  13. next_x = x + _next[i][0];
  14. next_y = y + _next[i][1];
  15. if(next_x < 0 || next_y < 0 || next_x >= n || next_y >= n){
  16. continue;
  17. }
  18. if(a[next_x][next_y] == 0){
  19. dfs(next_x,next_y);
  20. }
  21. }
  22. return;
  23. }
  24. int main(){
  25. cin >> n;
  26. for(int i = 0;i < n;i++){
  27. for(int j = 0;j < n;j++){
  28. cin >> a[i][j];
  29. }
  30. }
  31. for(int i = 0;i < n;i++){
  32. bool flag = false;
  33. for(int j = 0;j < n;j++){
  34. if(a[i][j] == 1){
  35. start_x = i + 1;
  36. start_y = j + 1; // 找到第一个1,从其右下角的0开始搜索
  37. flag = true;
  38. break;
  39. }
  40. }
  41. if(flag) break;
  42. }
  43. dfs(start_x,start_y);
  44. for(int i = 0;i < n;i++){
  45. for(int j = 0;j < n;j++){
  46. cout << a[i][j] << " ";
  47. }
  48. cout << endl;
  49. }
  50. return 0;
  51. }