codevs 1049 棋盘染色
题目描述 Description
有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少。读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块。(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接)
输入包括一个5×5的01矩阵,中间无空格,1表示格子已经被染成黑色。
输出最少需要对多少个格子进行染色
11100
11000
10000
01111
11111
1
well…搜索…先bfs找到黑的再扩展进行染色。判断么…用dfs判断是否连通。怀着高兴的心情提交上去。。。果然TLE了。。
呃呃好吧。我改一下判重。
原来是一个一个对比的,现在我把它转化成25位的二进制数,可以省去不少时间。
AC。。
#include <iostream>
#include <cstring>
using namespace std; typedef char zt[][];
zt m,q[],v;
int f,r,num[],dx[]={-,,,},dy[]={,,-,};
bool vis[];
int black[][],count=-;
int s; void dfs(zt ttpp,int xx,int yy)
{
if(xx<||xx>=||yy<||yy>=||v[xx][yy]||ttpp[xx][yy]=='')
return;
v[xx][yy]=;
for (int dd=;dd<;dd++)
dfs(ttpp,xx+dx[dd],yy+dy[dd]);
} int okay(zt tp)
{
int i;
memset(v,,sizeof(v));
for (i=;i<;i++)
if (tp[i/][i%]=='')
break;
dfs(tp,i/,i%);
for (int i=;i<;i++)
for (int j=;j<;j++)
if (tp[i][j]=='' && !v[i][j])
return ;
return ;
} int change_to_int(zt tt)
{
int rrr=,d=;
for (int i=;i>=;i--)
for (int j=;j>=;j--)
{
rrr+=(tt[i][j]-'')*d;
d*=;
}
return rrr;
} int bfs()
{
f=;r=;
for (int i=;i<;i++)
for (int j=;j<;j++)
q[][i][j]=m[i][j];
num[]=;
s=change_to_int(m);
vis[s]=;
while (f<r)
{
f++;
if (okay(q[f]))
return num[f];
count=-;
for (int i=;i<;i++)
for (int j=;j<;j++)
if (q[f][i][j]=='')
{
black[++count][]=i;
black[count][]=j;
}
for (int i=;i<=count;i++)
for (int j=;j<;j++)
{
int nx=black[i][]+dx[j];
int ny=black[i][]+dy[j];
if (nx<||nx>=||ny<||ny>=||q[f][nx][ny]=='')
continue;
r++;
for (int i=;i<;i++)
for (int j=;j<;j++)
{
q[r][i][j]=q[f][i][j];
}
q[r][nx][ny]='';
s=change_to_int(q[r]);
if (!vis[s])
{
vis[s]=;
num[r]=num[f]+;
}
else
r--;
}
}
return ;
} int main()
{
for (int i=;i<;i++)
for (int j=;j<;j++)
cin >> m[i][j];
cout << bfs() << "\n";
}
codevs 1049 棋盘染色的更多相关文章
- codevs——1049 棋盘染色
1049 棋盘染色 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有一个5×5的棋盘,上面有一 ...
- CODEVS——T 1049 棋盘染色
http://codevs.cn/problem/1049/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descr ...
- 【wikioi】1049 棋盘染色(迭代深搜)
http://www.wikioi.com/problem/1049/ 这题我之前写没想到迭代加深,看了题解,然后学习了这种搜索(之前我写的某题也用过,,但是不懂专业名词 囧.) 迭代加深搜索就是限制 ...
- [codevs1050]棋盘染色 2
[codevs1050]棋盘染色 2 试题描述 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入 第一行一个整数N(<=100) ...
- [codevs1049]棋盘染色<迭代深搜>
题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...
- 1050 棋盘染色 2 - Wikioi
题目描述 Description 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入描述 Input Description 第一行一个 ...
- CODEVS 2171 棋盘覆盖
2171 棋盘覆盖 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少12的多米诺骨牌进行掩盖. 错误日志: 直接在模板上调整 \(maxn\) 时没有在相应邻接表数 ...
- HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 Problem Description Teacher Mai is in a maze wit ...
- [CodeVs1050]棋盘染色2(状态压缩DP)
题目大意:有一个5*N(≤100)的棋盘,棋盘中的一些格子已经被染成了黑色,求最少对多少格子染色,所有的黑色能连成一块. 这题卡了我1h,写了2.6k的代码,清明作业一坨还没做啊...之前一直以为这题 ...
随机推荐
- SparkSQL的解析详解
SparkSQL继承自Hive的接口,由于hive是基于MapReduce进行计算的,在计算过程中大量的中间数据要落地于磁盘,从而消耗了大量的I/O,降低了运行的效率,从而基于内存运算的SparkSQ ...
- Eclipse中generate getter and setter对boolean的反应
有点意思 , 如果变量是boolean类型的 ,就会生成isxxx开头的getter方法 , 但如果是Boolean对象的 , 就会生成getterxx开头的getter对象. 例如 Boolean ...
- 深入ThreadLocal之一
想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLocal的理解,然后根据ThreadLocal类的源码 ...
- SOAP: java+xfire(web service) + php客户端
作者: 吴俊杰 web service这项技术暂不说它有多落伍,但是项目中用到了,没法逃避! xml和json各有各的好处,但是JSON无疑是当今数据交互的主流了.客户soap服务器端用的是 j ...
- printf("%*s\n", 1, ""); 使用"printf();" 的格式化输出动态制定等宽度输出。
#include <stdio.h> #include <string.h> int main() { const char the_text[] = "this i ...
- jquery ui autocomplete combox格式设置
<style> .custom-combobox {//设置输入框格式 position: relative; display: inline-block; width: 62%; } . ...
- SQL Server中GO的使用方法(转)
GO不是标准SQL语句,甚至不是T-SQL语句.它只是SQL Server管理器(SSMS)中用来提交T-SQL语句的一个标志.你可以在SSMS中任意指定这个提交标志.SSMS->工具-> ...
- gRPC java 客户端,服务器端通讯使用json格式
使用 protobuf 作为通讯内容序列化的简单例子请看:http://www.cnblogs.com/ghj1976/p/5458176.html . 本文是使用 json 做为内容序列化的简单例子 ...
- C Primer Plus(第五版)7
第 7 章 C 控制语句:分支和跳转 在本章中你将学习下列内容: · 关键字:if(如果),else(否则),switch(切换),continue(继续),break(中断), case(情况),d ...
- ListView中内容的动画效果
LayoutAnimationController用于为一个layout里面的控件,或者是一个ViewGroup里面的控件设置动画效果,可以在XML文件中设置,亦可以在Java代码中设置. 一种直接在 ...