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”。
样例输入
  1. 2
  2. 3
  3. yyy
  4. yyy
  5. yyy
  6. 5
  7. wwwww
  8. wwwww
  9. wwwww
  10. wwwww
  11. wwwww
样例输出
  1. 0
  2. 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 = ;
  21. cin>>n;
  22.  
  23. bool *arr_draw = new bool[(n + ) * (n + )];
  24. bool *arr_draw_save = new bool[(n + ) * (n + )];
  25. bool *arr_res = new bool[(n + ) * (n + )];
  26.  
  27. string str;
  28. memset(arr_draw,,sizeof(bool) * (n + ) * (n + ));
  29. for(i = ; i <= n; ++i)
  30. {
  31. cin>>str;
  32. for(j = ; j <= n; ++j)
  33. {
  34. if(str[j-] == 'y') arr_draw[i * (n + ) + j] = false;
  35. else arr_draw[i * (n + ) + j] = true;
  36. }
  37. }
  38. memcpy(arr_draw_save,arr_draw,sizeof(bool) * (n + ) * (n + ));
  39.  
  40. memset(arr_res + * (n + ),,sizeof(bool) * (n + ));
  41. while()
  42. {
  43. for(i = ; i <= n; ++i)
  44. {
  45. for(j = ; j <= n; ++j)
  46. {
  47. arr_draw[(i - ) * (n + ) + j] ^= arr_res[i * (n + ) + j];
  48. arr_draw[i * (n + ) + (j - )] ^= arr_res[i * (n + ) + j];
  49. arr_draw[i * (n + ) + (j + )] ^= arr_res[i * (n + ) + j];
  50. arr_draw[(i + ) * (n + ) + j] ^= arr_res[i * (n + ) + j];
  51. arr_draw[i * (n + ) + j] ^= arr_res[i * (n + ) + j];
  52. }
  53. memcpy(&arr_res[(i + ) * (n + )],&arr_draw[i * (n + )],sizeof(bool) * (n + ));
  54. }
  55. for(i = ; i <= n; ++i) if(arr_draw[n * (n + ) + i]) break;
  56. if(i > n) break;
  57. else
  58. {
  59. memcpy(arr_draw,arr_draw_save,sizeof(bool) * (n + ) * (n + ));
  60.  
  61. for(i = n; i > ; --i) if(!arr_res[ *(n + ) + i]) break;
  62. while(i <= n) {arr_res[ * (n + ) + i] = !arr_res[ * (n + ) + i]; ++i;}
  63.  
  64. for(i = ; i <= n; ++i) {if(arr_res[ * (n + ) + i]) break;}
  65. if(i > n) {flag = ; break;}
  66. }
  67. }
  68.  
  69. int count = ;
  70. if(flag)
  71. {
  72. for(i = ; i <= n; ++i)
  73. {
  74. for(j = ; j <= n; ++j)
  75. {
  76. count += arr_res[i * (n + ) + 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 ;
  89. }

OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem的更多相关文章

  1. POJ 1681 Painter's Problem 【高斯消元 二进制枚举】

    任意门:http://poj.org/problem?id=1681 Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total ...

  2. poj 1681 Painter's Problem

    Painter's Problem 题意:给一个n*n(1 <= n <= 15)具有初始颜色(颜色只有yellow&white两种,即01矩阵)的square染色,每次对一个方格 ...

  3. POJ 1681 Painter's Problem(高斯消元+枚举自由变元)

    http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...

  4. POJ 1681 Painter's Problem (高斯消元)

    题目链接 题意:有一面墙每个格子有黄白两种颜色,刷墙每次刷一格会将上下左右中五个格子变色,求最少的刷方法使得所有的格子都变成yellow. 题解:通过打表我们可以得知4*4的一共有4个自由变元,那么我 ...

  5. POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)

    题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...

  6. POJ 1681 Painter's Problem [高斯消元XOR]

    同上题 需要判断无解 需要求最小按几次,正确做法是枚举自由元的所有取值来遍历变量的所有取值取合法的最小值,然而听说数据太弱自由元全0就可以就水过去吧.... #include <iostream ...

  7. poj 1681 Painter&#39;s Problem(高斯消元)

    id=1681">http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. ...

  8. POJ 1222 POJ 1830 POJ 1681 POJ 1753 POJ 3185 高斯消元求解一类开关问题

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

  9. poj 1681(Gauss 消元)

    Painter's Problem Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5875   Accepted: 2825 ...

随机推荐

  1. SQLite使用教程11 表达式

    SQLite 表达式 表达式是一个或多个值.运算符和计算值的SQL函数的组合. SQL 表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. 语法 假设 SELECT 语句的基本 ...

  2. 【转】于request.getSession(true/false/null)的区别

    http://blog.csdn.net/gaolinwu/article/details/7285783 关于request.getSession(true/false/null)的区别 一.需求原 ...

  3. 修改hosts文件(判断是否为管理员/以管理员权限运行脚本)

    将以下命令保存为 HostsModify.ps1,然后执行即可 #该脚本用来添加hosts解析记录.脚本在执行的时候会判断当前用户是否为管理员,如果不是则弹出提示框口,要求输入相应密码 If (-NO ...

  4. CDOJ 1157 数列(seq) 分块+线段树

    数列(seq) Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1157 Desc ...

  5. IPVS

    http://kb.linuxvirtualserver.org/wiki/IPVS_FULLNAT_and_SYNPROXY

  6. C++中名字隐藏,名字查找优先于类型检查

    题目 C++中名字隐藏是什么? 解答 让我们通过一个例子来讲解C++中的名字隐藏.在C++中,如果一个类里有一个重载的方法, 你用另一个类去继承它并重写(覆盖)那个方法.你必须重写所有的重载方法, 否 ...

  7. Pitfalls of the Hibernate Second-Level / Query Caches--reference

    This post will go through how to setup the Hibernate Second-Level and Query caches, how they work an ...

  8. struts2 CRUD 入门 配置

    本文介绍struts2在eclipse下的配置,实现一个具有CRUD功能的图书管理系统. 1         开发环境配置 1.1           在Eclipse中配置Struts2 1.1.1 ...

  9. 两个字符串,若为数字则都相加,若有一个不为数字则,输出error

    import java.util.*; /*请设计一个算法能够完成两个用字符串存储的整数进行相加操作,对非法输入则返回“error”: * 用例:123 234 * 输出:357 * 用例123 as ...

  10. js重写原型对象

    首先看两段很相似的代码: 1. function Person(){} Person.prototype = { constructor:Person, name:"Nic", a ...