首页 技术 正文
技术 2022年11月20日
0 收藏 976 点赞 2,978 浏览 1964 个字

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计算出最少需要涂画多少块砖,才能使所有砖的颜色都变成黄色。
OpenJudge 2813 画家问题 / Poj 1681 Painter's Problem
输入
第一行是个整数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 ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,993
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,507
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,350
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,135
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,768
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,845