题目描述 Description

有一个5×5的棋盘,上面有一些格子被染成了黑色,其他的格子都是白色,你的任务的对棋盘一些格子进行染色,使得所有的黑色格子能连成一块,并且你染色的格子数目要最少。读入一个初始棋盘的状态,输出最少需要对多少个格子进行染色,才能使得所有的黑色格子都连成一块。(注:连接是指上下左右四个方向,如果两个黑色格子只共有一个点,那么不算连接)

输入描述 Input Description

输入包括一个5×5的01矩阵,中间无空格,1表示格子已经被染成黑色。

输出描述 Output Description

输出最少需要对多少个格子进行染色

样例输入 Sample Input

11100

11000

10000

01111

11111

样例输出 Sample Output

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 棋盘染色的更多相关文章

  1. codevs——1049 棋盘染色

    1049 棋盘染色  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Description 有一个5×5的棋盘,上面有一 ...

  2. CODEVS——T 1049 棋盘染色

    http://codevs.cn/problem/1049/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...

  3. 【wikioi】1049 棋盘染色(迭代深搜)

    http://www.wikioi.com/problem/1049/ 这题我之前写没想到迭代加深,看了题解,然后学习了这种搜索(之前我写的某题也用过,,但是不懂专业名词 囧.) 迭代加深搜索就是限制 ...

  4. [codevs1050]棋盘染色 2

    [codevs1050]棋盘染色 2 试题描述 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入 第一行一个整数N(<=100) ...

  5. [codevs1049]棋盘染色<迭代深搜>

    题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...

  6. 1050 棋盘染色 2 - Wikioi

    题目描述 Description 有一个5*N的棋盘,棋盘中的一些格子已经被染成了黑色,你的任务是对最少的格子染色,使得所有的黑色能连成一块. 输入描述 Input Description 第一行一个 ...

  7. CODEVS 2171 棋盘覆盖

    2171 棋盘覆盖 给出一张nn(n<=100)的国际象棋棋盘,其中被删除了一些点,问可以使用多少12的多米诺骨牌进行掩盖. 错误日志: 直接在模板上调整 \(maxn\) 时没有在相应邻接表数 ...

  8. HDU 5402 Travelling Salesman Problem(棋盘染色 构造 多校啊)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402 Problem Description Teacher Mai is in a maze wit ...

  9. [CodeVs1050]棋盘染色2(状态压缩DP)

    题目大意:有一个5*N(≤100)的棋盘,棋盘中的一些格子已经被染成了黑色,求最少对多少格子染色,所有的黑色能连成一块. 这题卡了我1h,写了2.6k的代码,清明作业一坨还没做啊...之前一直以为这题 ...

随机推荐

  1. PHP中的中文截取乱码问题_gb2312_utf-8

    一.字符串编码为gb2312,一个中文占俩字节 public static function chinesesubstr($str, $start, $len) { // $str指字符串,$star ...

  2. python 虎扑注册检查脚本

    ulipad,看着蛮舒服的. 图里的代码就是今天晚上的成果. 突然就想看看python这个被很多人说是优雅的语言,于是晚上没事就配了配环境,做了个东西 #encoding: utf-8 import ...

  3. C++ 类的动态组件化技术

    序言: N年前,我们曾在软件开发上出现了这样的困惑,用VC开发COM组件过于复杂,用VB开发COM组件发现效率低,而且不能实现面向对象的很多特性,例如,继承,多态等.更况且如何快速封装利用历史遗留的大 ...

  4. HDU 3001 Traveling(状压DP)

    题目大意:10个点的TSP问题,但是要求每个点最多走两边,不是只可以走一次,所以要用三进制的状态压缩解决这个问题.可以预处理每个状态的第k位是什么. 原代码链接:http://blog.csdn.ne ...

  5. codeforces 557 D. Vitaly and Cycle 组合数学 + 判断二分图

    D. Vitaly and Cycle       time limit per test 1 second memory limit per test 256 megabytes input sta ...

  6. java中四种引用类型(转)

    今天看代码,里面有一个类java.lang.ref.SoftReference把小弟弄神了,试想一下,接触java已经有3年了哇,连lang包下面的类都不了解,怎么混.后来在网上查资料,感觉收获颇多, ...

  7. 深入ThreadLocal之二

    概述 相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资 ...

  8. ArrayList,Vector线程安全性测试

    import java.util.ArrayList; import java.util.List; //实现Runnable接口的线程 public class HelloThread implem ...

  9. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...

  10. Jmeter Html 报告优化

    转载自南风_real博客园:http://www.cnblogs.com/jaychang/p/5881525.html 但是最近在查阅相关资料时,发现基本都是重复一篇文章Jmeter使用笔记之htm ...