zoukankan      html  css  js  c++  java
  • 第一周 枚举:1.画家问题

    总时间限制:
    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 
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 using namespace std;
     5  
     6 int t = 0;
     7 int n = 0;
     8 char col[20];
     9 bool c[20][20] = {0};
    10 bool colored[20][20] = {0};
    11 bool swit[20][20] = {0};
    12  
    13 void changeswit(int a, int b)
    14 {
    15     colored[a][b] = !colored[a][b];
    16     colored[a - 1][b] = !colored[a - 1][b];
    17     colored[a + 1][b] = !colored[a + 1][b];
    18     colored[a][b - 1] = !colored[a][b - 1];
    19     colored[a][b + 1] = !colored[a][b + 1];
    20 }
    21  
    22  
    23 int main()
    24 {
    25     scanf("%d", &t);
    26     for(int ti = 1; ti <= t; ++ti)
    27     {
    28         int sum = 0;
    29         scanf("%d", &n);
    30         int min = n * n + 1;
    31         for(int i = 1; i <= n; ++i)
    32         {
    33             scanf("%s", col);
    34             for(int j = 1; j <= n; ++j)
    35             {
    36                 if(col[j - 1] == 'y') c[i][j] = 1;
    37                 else c[i][j] = 0;
    38             }
    39         }
    40         for(int k = 0; k < pow(2.0, n); k++)
    41         {
    42             for(int i = 1; i <= n; i++)
    43                 for(int j = 1; j <= n; j++)
    44                 {
    45                     colored[i][j] = c[i][j];
    46                 }
    47             for(int i = 1; i <= n; i++)
    48             {
    49                 swit[1][i] = (k>>(i - 1)) & 1;
    50                 if(swit[1][i])
    51                 {
    52                     changeswit(1, i);
    53                     sum++;
    54                 }
    55             }
    56             for(int i = 2; i <= n; i++)
    57                 for(int j = 1; j <= n; j++)
    58                     if(!colored[i - 1][j])
    59                     {
    60                         swit[i][j] = 1;
    61                         sum++;
    62                         changeswit(i, j);
    63                     }
    64             int mark = 0;
    65             for(int j = 1; j <= n; j++)
    66                 if(!colored[n][j]) mark = 1;
    67             if(!mark && sum < min) min = sum;
    68             sum = 0;
    69         }
    70         if(min != n*n + 1) printf("%d\n",min);
    71         else printf("inf\n");
    72     }
    73     return 0;
    74 }         
  • 相关阅读:
    如何利用python制作微信好友头像照片墙?
    机器学习入门路线和资源
    突然“被辞职”的时候,原来可以拿到这么多钱!
    一个致命的 Redis 命令,导致公司损失 400 万
    程序员:想知道你每天按了多少次键盘吗?
    想了解真实的中国历史吗?建议看看这10部历史纪录片,受益终生!
    SpringBlade 2.0-RC3 发布,全新的微服务开发平台
    Syncd-开源自动化部署工具
    学习Spring Boot看这两个开源项目就够了!非得值得收藏的资源
    大型视频直播平台架构由浅入深详细讲解
  • 原文地址:https://www.cnblogs.com/Konayuki2015/p/4514210.html
Copyright © 2011-2022 走看看