题目大意:01矩阵,1表示黑色,0表示白色,求将白色染成黑色最少的次数

使黑色成为一整个联通块。

题解:

搜索bfs 90...

dfs判断连通

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; int cnt,ans,flag;
int map[][],vis[][];
int mx[]={,,,-},
my[]={,-,,};
string s; struct node{
int x,y;
}a[]; inline void find(int x,int y){
for(int i=;i<;i++){
int xx=x+mx[i],yy=y+my[i];
if(map[xx][yy]&&!vis[xx][yy]){
vis[xx][yy]=true;
find(xx,yy);
}
}
} bool check(){
int gg=;
memset(vis,,sizeof(vis));
for(int i=;i<=;i++)
for(register int j=;j<=;j++)
if(!vis[i][j]&&map[i][j]){
gg++;if(gg>)return false;
vis[i][j]=true;find(i,j);
}
return true;
} void dfs(int x,int sum){
if(x==cnt+){
if(check())
ans=min(ans,sum);
return;
}
map[a[x].x][a[x].y]=;
dfs(x+,sum+);
map[a[x].x][a[x].y]=;
dfs(x+,sum);
} int main(){
for(int i=;i<=;i++){
cin>>s;
for(int j=;j<=;j++){
map[i][j]=s[j-]-'';
if(!map[i][j])a[++cnt].x=i,a[cnt].y=j;
}
}
ans=*;
dfs(,);
printf("%d\n",ans);
return ;
}

90

bfs判断联通

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; int cnt,ans,flag;
int map[][],vis[][];
int mx[]={,,,-},
my[]={,-,,};
string s; struct node{
int x,y;
}a[];
struct T{
int x,y;
};
queue<T>q; bool check(){
// cout<<"hahahha"<<endl;
flag=false;
memset(vis,,sizeof(vis));
for(int i=;i<=;i++){
for(int j=;j<=;j++){
if(map[i][j]&&!vis[i][j]){
if(flag)return false;
flag=true;
T a;a.x=i;a.y=j;
q.push(a);vis[i][j]=true;
while(!q.empty()){
T now=q.front();q.pop();
int x=now.x,y=now.y;
for(int k=;k<;k++){
int xx=x+mx[k],yy=y+my[k];
if(xx<||yy<||xx>||yy>||vis[xx][yy]||map[xx][yy]!=map[i][j])continue;
T tmp;tmp.x=xx;tmp.y=yy;vis[xx][yy]=true;
q.push(tmp);
}
}
}
}
}
return true;
} void debug(){
for(int i=;i<=;i++){
for(int j=;j<=;j++)
printf("%d",map[i][j]);
printf("\n");
}
cout<<endl<<endl;
}
void dfs(int x,int sum){
if(x==cnt+){
if(check())
ans=min(ans,sum);
return;
}
map[a[x].x][a[x].y]=;
dfs(x+,sum+);
map[a[x].x][a[x].y]=;
dfs(x+,sum);
} int main(){
for(int i=;i<=;i++){
cin>>s;
for(int j=;j<=;j++){
map[i][j]=s[j-]-'';
if(!map[i][j])a[++cnt].x=i,a[cnt].y=j;
}
}
if(cnt==){
printf("0\n");
return ;
}
ans=*;
// debug();
// cout<<endl;
dfs(,);
printf("%d\n",ans);
return ;
}

90

迭代加深搜索

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std; int cnt,ans,flag,ret=-;
int map[][],vis[][];
int mx[]={,,,-},
my[]={,-,,};
string s; struct node{
int x,y;
}a[]; inline void find(int x,int y){
for(int i=;i<;i++){
int xx=x+mx[i],yy=y+my[i];
if(map[xx][yy]&&!vis[xx][yy]){
vis[xx][yy]=true;
find(xx,yy);
}
}
} bool check(){
int gg=;
memset(vis,,sizeof(vis));
for(int i=;i<=;i++)
for(int j=;j<=;j++)
if(!vis[i][j]&&map[i][j]){
gg++;if(gg>)return false;
vis[i][j]=true;find(i,j);
}
return true;
} void dfs(int x,int sum,int deep){
if(ret!=-)return;
if(sum==deep){
if(check())ret=deep;
return;
}
if(x==cnt+)return;//md没有这个一直re
map[a[x].x][a[x].y]=;
dfs(x+,sum+,deep);
map[a[x].x][a[x].y]=;
dfs(x+,sum,deep);
} int main(){
for(int i=;i<=;i++){
cin>>s;
for(int j=;j<=;j++){
map[i][j]=s[j-]-'';
if(!map[i][j])a[++cnt].x=i,a[cnt].y=j;
}
}
if(cnt==){
printf("0\n");
return ;
}
ans=*;
for(int deep=;deep<=;deep++){
dfs(,,deep);
if(ret!=-){
printf("%d\n",ret);
return ;
}
}
return ;
}

AC

CODEVS1049 棋盘染色的更多相关文章

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

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

  2. bzoj 1085骑士精神 迭代深搜

    题目传送门 题目大意:给出一幅棋盘,问能否复原,中文题面,不做解释. 思路:第一次写迭代深搜的题目,这道题还是挺经典的.这道题的状态很明显的每多搜一层就是多八倍,非常的多,而且又是t组输入,所以必定有 ...

  3. 小结:A* & IDA* & 迭代深搜

    概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...

  4. uva12558 Egyptian Fractions (HARD version)(迭代深搜)

    Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...

  5. [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>

    题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...

  6. [noip模拟]小猫爬山<迭代深搜>

    [题目描述]: Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Freda和rai ...

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

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

  8. 【BZOJ3041】水叮当的舞步 迭代深搜IDA*

    [BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...

  9. poj1321 棋盘问题(深搜dfs)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/prob ...

  10. POJ 1321 棋盘问题 (深搜)

    题目链接 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆 ...

随机推荐

  1. 平衡搜索树--红黑树 RBTree

    红黑树是一棵二叉搜索树,它在每个节点上增加了一个存储位来表示节点的颜色,可以是Red或Black. 通过对任何一条从根到叶子节点简单路径上的颜色来约束树的高度,红黑树保证最长路径不超过最短路径的两倍, ...

  2. 2062326 齐力锋 实验四《Java面向对象程序设计Android开发》实验报告

    北京电子科技学院(BESTI) 实 验 报 告 课程: 程序设计与数据结构  班级: 1623  姓名: 齐力锋 学号: 20162326 成绩: 指导教师: 娄嘉鹏/王志强 实验日期: 2017年5 ...

  3. cocoa应用程序中NSStatusItem的使用

    mac上的应用程序除了左上方会有菜单之外,在屏幕的右上方也会有一个图标样的菜单,这个类似于windows上右下角的system tray. 本文讲述如何给自己的应用程序添加一个system tray( ...

  4. BZOJ-5424: 烧桥计划(单调队列)

    BZOJ-5424: 烧桥计划(单调队列) 题目链接 题解: 先考虑最暴力的\(dp\):设\(f[k][i]\)表示搞掉第\(1\sim i\)段,烧了\(k\)段的最小花费,设\(calc(x,y ...

  5. js异步获取数据的问题

    最近做js开发的时候发现了很多哥们不能区分同步和异步的区别,典型的在ajax部分,在该ajax为异步操作的时候,获取不到success之后的data的值,于是产生了各种奇葩的写法.比如创建一个局部变量 ...

  6. java基础(4)--运算符及表达式

    运算符及表达式 算数运算 加(+) 减(-) 乘(*)  除(/) 取余(%) 自增(++) 自减(- -) 注意点 1. 同种类型参与运算(可能需要自动类型转换),返回同种类型 2. 整数的除法是整 ...

  7. UOJ34 多项式乘法(非递归版)

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. PHP模拟登录发送闪存

    url,post,cookie. 有这三种就可以了. 下面使用Postman模拟发送. 其中,body中是post参数,header中是cookie数据. 下面是php模拟代码. public fun ...

  9. QSS设置字体不起作用

    正确的QSS QLabel{ font-family: "Microsoft YaHei"; font-weight:bold; font-size:14px; color: #3 ...

  10. js 验证 -身份证等

    js验证身份证: function isIdCard(idCard) { var num = idCard.toLowerCase().match(/\w/g); if (idCard.match(/ ...