【UVA1505】 Flood-it!(IDA*)
题目链接
IDA*,估价函数为当前除了左上角的连通块以外颜色的种类数,因为每次最多消去一个颜色。
维护位于当前连通块的边缘但颜色不同的点,每次从这些点拓展就行。
#include <cstdio>
#include <cstring>
int a[10][10], n, l[] = {-1, 1, 0, 0}, r[] = {0, 0, -1, 1}, v[10], vis[10][10], limit;
void dfs(int now, int x, int y){
//printf("%d %d %d\n", now, x, y);
vis[x][y] = 1;
for(int i = 0; i < 4; ++i){
int X = x + l[i], Y = y + r[i];
if(X < 0 || Y < 0 || X >= n || Y >= n || vis[X][Y] == 1) continue;
vis[X][Y] = 2;
if(a[X][Y] == now) dfs(now, X, Y);
}
}
int fill(int now){
int p = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
if(a[i][j] == now && vis[i][j] == 2)
dfs(now, i, j), ++p;
return p;
}
int IDA(int now, int dep){
v[0] = v[1] = v[2] = v[3] = v[4] = v[5] = 0;
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
if(vis[i][j] != 1)
v[a[i][j]] = 1;
int f = v[0] + v[1] + v[2] + v[3] + v[4] + v[5];
if(!f) return 1;
if(dep + f > limit) return 0;
int tmp[10][10];
memcpy(tmp, vis, sizeof vis);
for(int k = 0; k < 6; ++k){
if(k == now) continue;
if(fill(k) && IDA(k, dep + 1)) return 1;
memcpy(vis, tmp, sizeof vis);
}
return 0;
}
int main(){
while(scanf("%d", &n) && n){
for(int i = 0; i < n; ++i)
for(int j = 0; j < n; ++j)
scanf("%d", &a[i][j]);
memset(vis, 0, sizeof vis);
dfs(a[0][0], 0, 0);
for(limit = 0; ; ++limit){
if(IDA(a[0][0], 0)){
printf("%d\n", limit);
break;
}
}
}
}
【UVA1505】 Flood-it!(IDA*)的更多相关文章
- 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现
本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...
- Android自己定义组件系列【7】——进阶实践(4)
上一篇<Android自己定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识.这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpa ...
- 【WPF】学习笔记(三)——这个家伙跟电子签名板有个约定
这篇博客依旧是以电子签名板为基础而展开的,主要是对前文([WPF]学习笔记(一)--做一个简单的电子签名板)存在的部分问题进行解释,以及部分小功能的添加.由于这篇博客是建立在学习笔记一的基础上的,所以 ...
- CJOJ 2040 【一本通】分组背包(动态规划)
CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...
- CJOJ 2307 【一本通】完全背包(动态规划)
CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...
- CJOJ 1071 【Uva】硬币问题(动态规划)
CJOJ 1071 [Uva]硬币问题(动态规划) Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为 ...
- 洛谷P3796 - 【模板】AC自动机(加强版)
原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...
- 【BZOJ1499】瑰丽华尔兹(动态规划)
[BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...
- 【BZOJ2998】Problem A(动态规划)
[BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp ...
- 【BZOJ2428】均分数据(模拟退火)
[BZOJ2428]均分数据(模拟退火) 题面 BZOJ 题解 先说说黄学长的做法: 当温度比较高的时候,贪心 每次随机一个数,把他放进当前和最少的那一组里面 温度足够低的时候就完全随机然后转移 这样 ...
随机推荐
- intellij ide调用一个对象所有的set方法
1.下载地址:https://github.com/yoke233/genSets/releases/download/1.1/genSets.jar 2.plugin 从本地磁盘安装找到jar,并重 ...
- 如何使用git把本地代码上传(更新)到github上
最近用到git和github记录一下 1.下载git并安装 到官网下载并安装就行了 *如果下载失败,或者太慢,可以复制链接到迅雷下载 2.上传 1.在github新建存储库 库名不能是中文 2.在需要 ...
- EOS 数据库RAM使用量的计算
如果你是EOS的合约开发者,相信你很有可能跟我一样对内存(RAM)的使用量感到不解.在使用multi_index进行数据存储时,明明只存了一点数据,但区块链浏览器中显示的内存占用量却上升了不少.在这篇 ...
- 虚拟机VirtualBox 共享挂载问题:mount: /mnt/xxx: wrong fs type, bad option, bad superblock on xxx
设置好共享文件夹之后,在/mnt下面建立了一个wwwroot文件夹,然后去欢天喜地的去挂载, mount -t vboxsf www /mnt/wwwroot 结果系统提示: mount: /mnt/ ...
- django后台list_display中添加自定义字段
list_display = ("apply_prove",) def apply_prove(self, obj): : return "<a href='/' ...
- cordova添加plugin的多种方式
#在线安装 cordova create chankoujie com.example.chankoujie ChanKouJie cordova plugin add cordova-plugin- ...
- matlab学习笔记8 基本绘图命令-基本绘图操作
一起来学matlab-matlab学习笔记8 基本绘图命令_2基本绘图操作 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 <matlab 程序设计与综合应用>张德丰等著 ...
- Shell流程控制语句case
case语法格式: case 变量或表达式 in 变量或表达式1) 命令1 ;; 变量或表达式2) 命令2 ;; ...... *) 默认命令 esac case语句流程控制图: 实例: [root ...
- vue 框架安装系列问题
npm install --global vue-cli 错误提示:vue-cli-service' 不是内部或外部命令,也不是可运行的程序或批处理文件解决:如果是npm安装的 执行 npm -g b ...
- RedisTemplate通过scan方法进行自定义操作:1、根据hashKey的名称匹配相关hash键值对
需求:有一个hash如下,现在想查询出stream前缀的键值对 操作方法如下: package com.example; import org.junit.Before; import org.jun ...