zoukankan      html  css  js  c++  java
  • 《Cracking the Coding Interview》——第9章:递归和动态规划——题目7

    2014-03-20 03:35

    题目:实现画图的Flood Fill操作。

    解法:DFS和BFS皆可,但BFS使用的队列在时间复杂度上常数项比较大,速度略慢,所以我选了DFS。当然,如果图很大的话DFS是会导致call stack溢出的,那就摊上事儿了。

    代码:

     1 // 9.7 Implement a flood fill painter that changes a certain area to a certain color. You are given one point as the seed.
     2 #include <cstdio>
     3 #include <vector>
     4 using namespace std;
     5 
     6 void floodFill(int i, int j, int n, int m, int new_color, vector<vector<int> > &canva)
     7 {
     8     int old_color = canva[i][j];
     9 
    10     canva[i][j] = new_color;
    11     if (i >= 1 && old_color == canva[i - 1][j]) {
    12         floodFill(i - 1, j, n, m, new_color, canva);
    13     }
    14     if (i <= n - 2 && old_color == canva[i + 1][j]) {
    15         floodFill(i + 1, j, n, m, new_color, canva);
    16     }
    17     if (j >= 1 && old_color == canva[i][j - 1]) {
    18         floodFill(i, j - 1, n, m, new_color, canva);
    19     }
    20     if (j <= m - 2 && old_color == canva[i][j + 1]) {
    21         floodFill(i, j + 1, n, m, new_color, canva);
    22     }
    23 }
    24 
    25 int main()
    26 {
    27     int i, j, c;
    28     int n, m;
    29     vector<vector<int> > canva;
    30     
    31     scanf("%d%d", &n, &m);
    32     canva.resize(n);
    33     for (i = 0; i < n; ++i) {
    34         canva[i].resize(m);
    35     }
    36     
    37     for (i = 0; i < n; ++i) {
    38         for (j = 0; j < m; ++j) {
    39             scanf("%d", &canva[i][j]);
    40         }
    41     }
    42     
    43     while (scanf("%d%d%d", &i, &j, &c) == 3) {
    44         if (i >= 0 && i <= n - 1 && j >= 0 && j <= m - 1) {
    45             floodFill(i, j, n, m, c, canva);
    46         }
    47         for (i = 0; i < n; ++i) {
    48             for (j = 0; j < m; ++j) {
    49                 printf((j == 0 ? "%d" : " %d"), canva[i][j]);
    50             }
    51             printf("
    ");
    52         }
    53     }
    54     
    55     for (i = 0; i < n; ++i) {
    56         canva[i].clear();
    57     }
    58     canva.clear();
    59     
    60     return 0;    
    61 }
  • 相关阅读:
    java 版下载地址
    java文档
    中文打包之后无法显示
    通过Unity3d创建二维码(利用zxing2.2)
    通过NavMeshObstacle解决NavMesh防卡
    EditorGUILayout.EnumPopup 枚举弹出选择菜单
    价格表
    热更新脚本C#light,ulua,Scorpio性能比较
    Ngui 五种点击事件实现方式及在3d场景中点透的情况
    linux每日命令(38):iostat命令
  • 原文地址:https://www.cnblogs.com/zhuli19901106/p/3612796.html
Copyright © 2011-2022 走看看