题目链接

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*)的更多相关文章

  1. 【tornado】系列项目(二)基于领域驱动模型的区域后台管理+前端easyui实现

    本项目是一个系列项目,最终的目的是开发出一个类似京东商城的网站.本文主要介绍后台管理中的区域管理,以及前端基于easyui插件的使用.本次增删改查因数据量少,因此采用模态对话框方式进行,关于数据量大采 ...

  2. Android自己定义组件系列【7】——进阶实践(4)

    上一篇<Android自己定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识.这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpa ...

  3. 【WPF】学习笔记(三)——这个家伙跟电子签名板有个约定

    这篇博客依旧是以电子签名板为基础而展开的,主要是对前文([WPF]学习笔记(一)--做一个简单的电子签名板)存在的部分问题进行解释,以及部分小功能的添加.由于这篇博客是建立在学习笔记一的基础上的,所以 ...

  4. CJOJ 2040 【一本通】分组背包(动态规划)

    CJOJ 2040 [一本通]分组背包(动态规划) Description 一个旅行者有一个最多能用V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2, ...

  5. CJOJ 2307 【一本通】完全背包(动态规划)

    CJOJ 2307 [一本通]完全背包(动态规划) Description 设有n种物品,每种物品有一个重量及一个价值.但每种物品的数量是无限的,同时有一个背包,最大载重量为M,今从n种物品中选取若干 ...

  6. CJOJ 1071 【Uva】硬币问题(动态规划)

    CJOJ 1071 [Uva]硬币问题(动态规划) Description 有n种硬币,面值分别为v1, v2, ..., vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为 ...

  7. 洛谷P3796 - 【模板】AC自动机(加强版)

    原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...

  8. 【BZOJ1499】瑰丽华尔兹(动态规划)

    [BZOJ1499]瑰丽华尔兹(动态规划) 题面 BZOJ 题解 先写部分分 设\(f[t][i][j]\)表示当前在\(t\)时刻,位置在\(i,j\)时走的最多的步数 这样子每一步要么停要么走 时 ...

  9. 【BZOJ2998】Problem A(动态规划)

    [BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp ...

  10. 【BZOJ2428】均分数据(模拟退火)

    [BZOJ2428]均分数据(模拟退火) 题面 BZOJ 题解 先说说黄学长的做法: 当温度比较高的时候,贪心 每次随机一个数,把他放进当前和最少的那一组里面 温度足够低的时候就完全随机然后转移 这样 ...

随机推荐

  1. Gradle入门系列

    http://blog.jobbole.com/71999/ 版权声明:本文为博主原创文章,未经博主允许不得转载.

  2. 从0开始部署GPU集群-1:k8s部署生态

    1 k8s:nvidia deepops 2  批处理:华为volcano 3 工作流:argo

  3. ASP.NET与非托管DLL的那些事儿【转+增】

    https://www.cnblogs.com/yeahgis/archive/2011/11/12/2246341.html ASP.NET与非托管DLL的那些事儿 环境VS2010 语言:ISO ...

  4. CgLib实现AOP

    一.CgLib实现动态代理的例子 1.创建Person类 package com.example.cglib; public class Person { public void study(){ S ...

  5. mysql查询列定义,是否自增等

    SELECT ORDINAL_POSITION AS Colorder, Column_Name AS ColumnName, data_type AS TypeName, COLUMN_COMMEN ...

  6. Oracle系列一 SQL语句基本概念和学习准备

    DML: Data Manipulation Language 数据操纵语言DDL:  Data Definition Language 数据定义语言DCL:  Data Control Langua ...

  7. Spring cloud微服务安全实战-7-2docker快速入门

    因为后面运行的这些可视化的工具都是用docker去run 的.为了避免对docker完全没有概念的同学听不懂,帮助大家从概念上去理解docker是个什么东西. 最核心的东西就是镜像,把它理解为Spri ...

  8. Hadoop YARN:调度性能优化实践(转)

    https://tech.meituan.com/2019/08/01/hadoop-yarn-scheduling-performance-optimization-practice.html 文章 ...

  9. [LeetCode] 853. Car Fleet 车队

    N cars are going to the same destination along a one lane road.  The destination is target miles awa ...

  10. web自动化测试笔记(二)

    如何使用selenium工具 上章节介绍了搭建web自动化的环境,这个章节介绍如何使用selenium写自动化脚本. 1.selenium selenium是一个用于web应用程序的测试工具.它可以帮 ...