题目大意: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. 联合体union

    1.一般而言,共用体类型实际占用存储空间为其最长的成员所占的存储空间: //4*7==282.若是该最长的存储空间对其他成员的元类型(如果是数组,取其类型的数据长度,例int a[5]为4)不满足整除 ...

  2. HDU 1176 免费馅饼 简单动态规划

    世道很简单的动态规划,但是却错了,让我很无语,改来改去还是不对,第二天有写就对了,之后我就耐着性子慢慢比较之前的错误代码,发现 第一次错:纯粹用了a[i][j]+=max3(a[i+1][j-1], ...

  3. fabric文件上传打包与校验

  4. dedecms 织梦利用arcpagelist标签实现首页arclist分页

    DedeCMS首页arclist分页可以利用arcpagelist标签来实现,这里说一下调用方法:首先必须在首页的<head></head>标签里面引入如下js代码: < ...

  5. MySQL 触发器简单实例 - 转载

    MySQL 触发器简单实例 触发器:可以更新,删除,插入触发器,不同种类的触发器可以存在于同一个表,但同种类的不能有多个.一个更新.一个删除是可以共存的. ~~语法~~ CREATE TRIGGER  ...

  6. JavaWeb -- Struts1 使用示例: 表单校验 防表单重复提交 表单数据封装到实体

    1. struts 工作流程图 超链接 2. 入门案例 struts入门案例: 1.写一个注册页面,把请求交给 struts处理 <form action="${pageContext ...

  7. python学习笔记(异常处理)

    上次提到正则表达式 当未匹配到数据返回值 None 再使用 match.group 会出现异常 AttributeError 为了避免异常我改成“ match != None” 这次加入异常处理 #! ...

  8. Selenium学习笔记(1) - 自动化测试体系与原理

    技术体系 基于代码的测试(Code-Based Testing) 基于协议的测试(Protocol-Based Testing) 基于界面的测试(GUI-Based Testing) 工作原理 基于代 ...

  9. mysql必会必知

    select distinct CHARACTER_SET_NAME from CHARACTER_SETS limit 12 offset 30;select distinct CHARACTER_ ...

  10. mysql 习题

    习题1 1.创建一个库(dt55_mysql),在库下创建一张students表 (1)students表中的字段有:id(int类型),stuName(varchar类型),age(int类型),w ...