CODEVS1049 棋盘染色
题目大意: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 棋盘染色的更多相关文章
- [codevs1049]棋盘染色<迭代深搜>
题目链接:http://codevs.cn/problem/1049/ 昨天的测试题里没有打出那可爱的迭代深搜,所以今天就来练一练. 这道题其实我看着有点懵,拿着题我就这状态↓ 然后我偷偷瞄了一眼hz ...
- bzoj 1085骑士精神 迭代深搜
题目传送门 题目大意:给出一幅棋盘,问能否复原,中文题面,不做解释. 思路:第一次写迭代深搜的题目,这道题还是挺经典的.这道题的状态很明显的每多搜一层就是多八倍,非常的多,而且又是t组输入,所以必定有 ...
- 小结:A* & IDA* & 迭代深搜
概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...
- uva12558 Egyptian Fractions (HARD version)(迭代深搜)
Egyptian Fractions (HARD version) 题解:迭代深搜模板题,因为最小个数,以此为乐观估价函数来迭代深搜,就可以了. #include<cstdio> #inc ...
- [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>
题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...
- [noip模拟]小猫爬山<迭代深搜>
[题目描述]: Freda和rainbow饲养了N只小猫,这天,小猫们要去爬山.经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_<). Freda和rai ...
- 【wikioi】1049 棋盘染色(迭代深搜)
http://www.wikioi.com/problem/1049/ 这题我之前写没想到迭代加深,看了题解,然后学习了这种搜索(之前我写的某题也用过,,但是不懂专业名词 囧.) 迭代加深搜索就是限制 ...
- 【BZOJ3041】水叮当的舞步 迭代深搜IDA*
[BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...
- poj1321 棋盘问题(深搜dfs)
转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:id=1321">http://poj.org/prob ...
- POJ 1321 棋盘问题 (深搜)
题目链接 Description 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆 ...
随机推荐
- SQL注入导图
本图来自信安之路学生渗透小组@辽宁-web-TwoDog, 博主觉得这张图画的很好,所以贴在这里提供参考!
- shell 中的 eval 及 crontab 命令
eval eval会对后面的命令进行两遍扫描,如果第一遍扫描后,命令是个普通命令,则执行此命令:如果命令中含有变量的间接引用,则保证间接引用的语义.也就是说,eval命令将会首先扫描命令行进行所有的置 ...
- BI项目中的ETL设计详解(数据抽取、清洗与转换 )(转载)
原文:http://www.cnblogs.com/reportmis/p/5939732.html ETL是BI项目最重要的一个环节,通常情况下ETL会花掉整个项目的1/3的时间,ETL设计的好坏直 ...
- Dijkstra算法 - 最短路径算法
2017-07-26 22:30:45 writer:pprp dijkstra算法法则:设置顶点集合S,首先将起始点加入该集合,然后根据起始点到其他顶点的路径长度, 选择路径长度最小的顶点加入到集合 ...
- SSH2 增删查改实例
(一)引入包 (共73个,不一定都需要,但是我的项目是这么多,经过调试,没有包冲突) (二)创建数据库表 建立数据库octtest,并创建user表,表里面一共4个字段:id,姓,名,年龄. 语句如下 ...
- Webstorm常用快捷键备忘(Webstorm入门指南)
WebStorm 是jetbrains公司旗下一款JavaScript 开发工具.被广大中国JS开发者誉为“Web前端开发神器”.“最强大的HTML5编辑器”.“最智能的JavaSscript IDE ...
- Go语言 channel 管道 阻塞 死锁 经典问题
建议阅读:14.2协程间的信道 问题:为什么代码1会报死锁的错误,而代码2不会报错? 代码1: package main import ( "fmt" ) func main() ...
- socket编程 TCP 粘包和半包 的问题及解决办法
一般在socket处理大数据量传输的时候会产生粘包和半包问题,有的时候tcp为了提高效率会缓冲N个包后再一起发出去,这个与缓存和网络有关系. 粘包 为x.5个包 半包 为0.5个包 由于网络原因 一次 ...
- .Net Core使用jexus配置https
今天搞了一下怎么从http换成https,写一篇博客记录该过程.关于jexus的安装和使用请看我之前的一篇博客<Jexus部署Asp.Net Core项目>,唯一的不同是,将jexus升级 ...
- pipenv安装库使用国内镜像
pipenv install django超级慢,卡住不动,最后不得不CTRL+C中止 这时有必要改成国内源了,打开Pipfile文件,发现内容是: [[source]] verify_ssl = t ...