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 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆 ...
随机推荐
- 20145235李涛《网络对抗》Exp6 信息搜集与漏洞扫描
基础问答 那些组织负责DNS,IP的管理? 全球根服务器均由美国政府授权的ICANN统一管理,负责全球的域名根服务器.DNS和IP地址管理.全球根域名服务器:绝大多数在欧洲和北美(全球13台,用A~M ...
- idea中git合并切换分支等操作
https://blog.csdn.net/autfish/article/details/52513465
- 深入Jetty源码之Servlet框架及实现(Servlet、Filter、Registration)
概述 Servlet是Server Applet的缩写,即在服务器端运行的小程序,而Servlet框架则是对HTTP服务器(Servlet Container)和用户小程序中间层的标准化和抽象.这一层 ...
- OpenStack Ceilometer -- 后台数据存储优化之MongoDB的分片存储设置
https://xiaofandh12.github.io/Mongo-Shard 关于MongoDB MongoDB中的概念与关系型数据库之间的对应: Database --> Databas ...
- 智课雅思词汇---二十五、-ate
智课雅思词汇---二十五.-ate 一.总结 一句话总结:又是动词,又是名词,又是形容词 后缀:-ate ①[动词后缀] 表示做.造成.使之成....做...事等意义 hyphenate 加连字符 o ...
- 【转】Java设计模式-单例模式详解
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6510196.html 所谓单例,指的就是单实例,有且仅有一个类实例,这个单例不应该由人来控 ...
- C++(十六) — 类中引用成员函数、命名空间的使用
1.为什么类中引用成员函数? 类将属性和方法做了封装.类是一种数据类型,也就是:固定大小内存块的别名. 类的定义是一个抽象的概念,定义时不分配内存,当用类定义对象时,才分配一个固定大小的内存块. 此时 ...
- Codeforces Round #448 (Div. 2)C. Square Subsets
可以用状压dp,也可以用线型基,但是状压dp没看台懂... 线型基的重要性质 性质一:最高位1的位置互不相同 性质二:任意一个可以用这些向量组合出的向量x,组合方式唯一 性质三:线性基的任意一个子集异 ...
- 012——VUE中todos示例讲解class中应用表达式
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- 大马猴队-Alpha阶段项目复审
队名 优点 缺点 名次 菜鸡互坑队 经典游戏,情怀加分. 刷新的苹果会在蛇身上出现 14 菜鸡互啄 利用python语言实现git版本管理,典型用户清晰. 没有很好地分析用户痛点,没有测试计划 4 ...