• OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem


    1.链接地址:

    http://bailian.openjudge.cn/practice/2813

    http://poj.org/problem?id=1681

    2.题目:

    总时间限制:
    1000ms
    内存限制:
    65536kB
    描述
    有一个正方形的墙,由N*N个正方形的砖组成,其中一些砖是白色的,另外一些砖是黄色的。Bob是个画家,想把全部的砖都涂成黄色。但他的画 笔不好使。当他用画笔涂画第(i, j)个位置的砖时, 位置(i-1, j)、 (i+1, j)、 (i, j-1)、 (i, j+1)上的砖都会改变颜色。请你帮助Bob计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。
    输入
    第一行是个整数t(1≤t ≤20),表示要测试的案例数。然后是t个案例。每个案例的首行是一个整数n (1≤n ≤15),表示墙的大小。接下来的n行表示墙的初始状态。每一行包含n个字符。第i行的第j个字符表示位于位置(i,j)上的砖的颜色。“w”表示白 砖,“y”表示黄砖。
    输出
    每个案例输出一行。如果Bob能够将所有的砖都涂成黄色,则输出最少需要涂画的砖数,否则输出“inf”。
    样例输入
    2 
    3 
    yyy 
    yyy 
    yyy 
    5
    wwwww 
    wwwww 
    wwwww 
    wwwww 
    wwwww 
    样例输出
    0 
    15 
    来源
    1681

    3.思路:

    此题思路与 OpenJudge 2811 熄灯问题 和 Poj 1222 EXTENDED LIGHTS OUT 一样,请查看以下

    http://www.cnblogs.com/mobileliker/p/3548190.html

    注意此题的区别是有可能出现不存在的情况,所以要多一个判断

    4.代码:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstdlib>
     4 #include <string>
     5 #include <cstring>
     6 
     7 using namespace std;
     8 
     9 int main()
    10 {
    11     int i,j;
    12 
    13     int t;
    14     cin>>t;
    15 
    16     int n;
    17     int flag;
    18     while(t--)
    19     {
    20         flag = 1;
    21         cin>>n;
    22 
    23         bool *arr_draw = new bool[(n + 2) * (n + 2)];
    24         bool *arr_draw_save = new bool[(n + 2) * (n + 2)];
    25         bool *arr_res = new bool[(n + 2) * (n + 2)];
    26 
    27         string str;
    28         memset(arr_draw,0,sizeof(bool) * (n + 2) * (n + 2));
    29         for(i = 1; i <= n; ++i)
    30         {
    31             cin>>str;
    32             for(j = 1; j <= n; ++j)
    33             {
    34                 if(str[j-1] == 'y') arr_draw[i * (n + 2) + j] = false;
    35                 else arr_draw[i * (n + 2) + j] = true;
    36             }
    37         }
    38         memcpy(arr_draw_save,arr_draw,sizeof(bool) * (n + 2) * (n + 2)); 
    39 
    40         memset(arr_res + 1 * (n + 2),0,sizeof(bool) * (n + 2));
    41         while(1)
    42         {
    43             for(i = 1; i <= n; ++i)
    44             {
    45                 for(j = 1; j <= n; ++j)
    46                 {
    47                     arr_draw[(i - 1) * (n + 2) + j] ^= arr_res[i * (n + 2) + j];
    48                     arr_draw[i * (n + 2) + (j - 1)] ^= arr_res[i * (n + 2) + j];
    49                     arr_draw[i * (n + 2) + (j + 1)] ^= arr_res[i * (n + 2) + j];
    50                     arr_draw[(i + 1) * (n + 2) + j] ^= arr_res[i * (n + 2) + j];
    51                     arr_draw[i * (n + 2) + j] ^= arr_res[i * (n + 2) + j];
    52                 }
    53                 memcpy(&arr_res[(i + 1) * (n + 2)],&arr_draw[i * (n + 2)],sizeof(bool) * (n + 2));
    54             }
    55             for(i = 1; i <= n; ++i) if(arr_draw[n * (n + 2) + i]) break;
    56             if(i > n) break;
    57             else
    58             {
    59                 memcpy(arr_draw,arr_draw_save,sizeof(bool) * (n + 2) * (n + 2));
    60 
    61                 for(i = n; i > 0; --i) if(!arr_res[1 *(n + 2) + i]) break;
    62                 while(i <= n) {arr_res[1 * (n + 2) + i] = !arr_res[1 * (n + 2) + i]; ++i;}
    63 
    64                 for(i = 1; i <= n; ++i) {if(arr_res[1 * (n + 2) + i]) break;}
    65                 if(i > n) {flag = 0; break;}
    66             }
    67         }
    68 
    69         int count = 0;
    70         if(flag)
    71         {
    72             for(i = 1; i <= n; ++i)
    73             {
    74                 for(j = 1; j <= n; ++j)
    75                 {
    76                     count += arr_res[i * (n + 2) + j];
    77                 }
    78             }
    79             cout<<count<<endl;
    80         }
    81         else cout<<"inf"<<endl;
    82 
    83         delete [] arr_draw;
    84         delete [] arr_draw_save;
    85         delete [] arr_res;
    86         
    87     }
    88     return 0;
    89 }
  • 相关阅读:
    for循环原来是这样
    C#中属性的作用
    腾讯、百度、阿里、微软面试题精选(不断更新)
    不容易:社会保险法历时3年终获通过 事关亿万百姓利益
    Oracle操作大对象BLOB示例
    Oracle操作大对象CLOB
    设计模式的分类和每种类型的作用
    LinkedList、ArrayList和Vector集合类型的区别和联系?
    hashmap,hashtable,TreeMap, WeakHashMap的区别和联系?
    hdu 2551
  • 原文地址:https://www.cnblogs.com/mobileliker/p/3549804.html
Copyright © 2020-2023  润新知