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.代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <cstring> using namespace std; int main()
{
int i,j; int t;
cin>>t; int n;
int flag;
while(t--)
{
flag = ;
cin>>n; bool *arr_draw = new bool[(n + ) * (n + )];
bool *arr_draw_save = new bool[(n + ) * (n + )];
bool *arr_res = new bool[(n + ) * (n + )]; string str;
memset(arr_draw,,sizeof(bool) * (n + ) * (n + ));
for(i = ; i <= n; ++i)
{
cin>>str;
for(j = ; j <= n; ++j)
{
if(str[j-] == 'y') arr_draw[i * (n + ) + j] = false;
else arr_draw[i * (n + ) + j] = true;
}
}
memcpy(arr_draw_save,arr_draw,sizeof(bool) * (n + ) * (n + )); memset(arr_res + * (n + ),,sizeof(bool) * (n + ));
while()
{
for(i = ; i <= n; ++i)
{
for(j = ; j <= n; ++j)
{
arr_draw[(i - ) * (n + ) + j] ^= arr_res[i * (n + ) + j];
arr_draw[i * (n + ) + (j - )] ^= arr_res[i * (n + ) + j];
arr_draw[i * (n + ) + (j + )] ^= arr_res[i * (n + ) + j];
arr_draw[(i + ) * (n + ) + j] ^= arr_res[i * (n + ) + j];
arr_draw[i * (n + ) + j] ^= arr_res[i * (n + ) + j];
}
memcpy(&arr_res[(i + ) * (n + )],&arr_draw[i * (n + )],sizeof(bool) * (n + ));
}
for(i = ; i <= n; ++i) if(arr_draw[n * (n + ) + i]) break;
if(i > n) break;
else
{
memcpy(arr_draw,arr_draw_save,sizeof(bool) * (n + ) * (n + )); for(i = n; i > ; --i) if(!arr_res[ *(n + ) + i]) break;
while(i <= n) {arr_res[ * (n + ) + i] = !arr_res[ * (n + ) + i]; ++i;} for(i = ; i <= n; ++i) {if(arr_res[ * (n + ) + i]) break;}
if(i > n) {flag = ; break;}
}
} int count = ;
if(flag)
{
for(i = ; i <= n; ++i)
{
for(j = ; j <= n; ++j)
{
count += arr_res[i * (n + ) + j];
}
}
cout<<count<<endl;
}
else cout<<"inf"<<endl; delete [] arr_draw;
delete [] arr_draw_save;
delete [] arr_res; }
return ;
}
OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem的更多相关文章
- POJ 1681 Painter's Problem 【高斯消元 二进制枚举】
任意门:http://poj.org/problem?id=1681 Painter's Problem Time Limit: 1000MS Memory Limit: 10000K Total ...
- poj 1681 Painter's Problem
Painter's Problem 题意:给一个n*n(1 <= n <= 15)具有初始颜色(颜色只有yellow&white两种,即01矩阵)的square染色,每次对一个方格 ...
- POJ 1681 Painter's Problem(高斯消元+枚举自由变元)
http://poj.org/problem?id=1681 题意:有一块只有黄白颜色的n*n的板子,每次刷一块格子时,上下左右都会改变颜色,求最少刷几次可以使得全部变成黄色. 思路: 这道题目也就是 ...
- POJ 1681 Painter's Problem (高斯消元)
题目链接 题意:有一面墙每个格子有黄白两种颜色,刷墙每次刷一格会将上下左右中五个格子变色,求最少的刷方法使得所有的格子都变成yellow. 题解:通过打表我们可以得知4*4的一共有4个自由变元,那么我 ...
- POJ 1681 Painter's Problem (高斯消元 枚举自由变元求最小的步数)
题目链接 题意: 一个n*n 的木板 ,每个格子 都 可以 染成 白色和黄色,( 一旦我们对也个格子染色 ,他的上下左右 都将改变颜色): 给定一个初始状态 , 求将 所有的 格子 染成黄色 最少需要 ...
- POJ 1681 Painter's Problem [高斯消元XOR]
同上题 需要判断无解 需要求最小按几次,正确做法是枚举自由元的所有取值来遍历变量的所有取值取合法的最小值,然而听说数据太弱自由元全0就可以就水过去吧.... #include <iostream ...
- poj 1681 Painter's Problem(高斯消元)
id=1681">http://poj.org/problem? id=1681 求最少经过的步数使得输入的矩阵全变为y. 思路:高斯消元求出自由变元.然后枚举自由变元,求出最优值. ...
- 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:// ...
- poj 1681(Gauss 消元)
Painter's Problem Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5875 Accepted: 2825 ...
随机推荐
- Triangles
1010: Triangles Time Limit: 2 Sec Memory Limit: 128 MB Submit: 18 Solved: 8 Description You are ...
- 对<< ubuntu 12.04编译安装linux-3.6.10内核笔记>>的修正
前题: 在前几个月的时候,写了一篇笔记,说的是kernel compile的事情,当时经验不足,虽说编译过了,但有些地方写的有错误--因为当时的理解是有错误的.今天一一更正,记录如下: 前文笔记链接: ...
- SQL Server笔记
SQL Server所能读取的最小单位是页,每个页8KB,8个物理上连续的页就是一个区,这样数据库中每MB就包含有16个区 堆是没有聚集索引的表.如果表格上没有聚集索引,数据行将不按任何特殊顺序存储, ...
- Java Swing界面编程(1)
写多了jsp,对于页面式的系统已经写烦了,本人也開始着手于java swing的学习,作为菜鸟,仅想用博客记录下我的swing学习的历程.话不多说,首先開始我的第一个窗体化程序. 下面给出源码: pa ...
- hdu 5446 Unknown Treasure lucas和CRT
Unknown Treasure Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?p ...
- 手把手教你Android来去电通话自动录音的方法
我们在使用Android手机打电话时,有时可能会需要对来去电通话自动录音,本文就详细讲解实现Android来去电通话自动录音的方法,大家按照文中的方法编写程序就可以完成此功能. 来去电自动录音的关键在 ...
- ios的NSMutableString用法
版权声明:本文为博主原创文章,未经博主允许不得转载. 详见代码: // // main.m // Foundation5-NSMutableString // // Created by mj ...
- Android(java)学习笔记125:Clock app编写报错02
1.首先之间看错误: 07-13 10:07:55.354: E/AndroidRuntime(8008): FATAL EXCEPTION: main 07-13 10:07:55.354: E/A ...
- ASP.NET 相同页面前后端之间传值
aspx页面前后端之间传值:前端的html或js获得后端的cs,后端的cs获得前端的js值. 一.前端获得后端的值 1.html元素 前端: <td><%=str%></ ...
- tomcat安装与配置文件
一 安装tomcat 1.系统必须已安装配置JDK 安装说明参考地址:http://www.cnblogs.com/Yuanbangchen/p/5945491.html 2.将apache-to ...
