【BZOJ3041】水叮当的舞步

Description

水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~
地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。

Input

每个测试点包含多组数据。
每组数据的第一行是一个整数N,表示地摊上的格子有N行N列。
接下来一个N*N的矩阵,矩阵中的每个数都在0~5之间,描述了每个格子的颜色。
N=0代表输入的结束。

Output

对于每组数据,输出一个整数,表示最少步数。

Sample Input

2
0 0
0 0
3
0 1 2
1 1 2
2 2 1
0

Sample Output

0
3
对于100%的数据,N<=8,每个测试点不多于20组数据。

题解:迭代搜索,即每次设定一个深度,DFS到这个深度时便停止搜索。如果当前深度下找不到解,则深度++。

但是本题直接迭代搜索会TLE,我们需要加剪枝。我(chao)的剪枝方法如下:

1.如果我们选择将左上角的联通块颜色变为x,但是染色后联通块的大小并没有增大,则不进行这次染色。
2.我们设定一个估价函数g=剩余的颜色数-1,那么当g>剩余的迭代次数时,则停止搜索。

然后就光荣的11s卡过,变成status倒数第一~

#include <cstdio>
#include <cstring>
#include <iostream>
#include <map>
int n,flag;
bool vis[8][8],used[8];
struct node
{
int v[8][8],lft,cnt;
int * operator [] (int a) {return v[a];}
node () {memset(v,0,sizeof(v)),lft=0;}
};
int dx[]={1,0,-1,0},dy[]={0,1,0,-1};
void color(node &a,int x,int y,int val)
{
if(!x&&!y) memset(vis,0,sizeof(vis));
vis[x][y]=1;
for(int i=0;i<4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx<0||tx>=n||ty<0||ty>=n||a[tx][ty]!=a[x][y]||vis[tx][ty]) continue;
color(a,tx,ty,val);
}
a[x][y]=val;
}
void count(node &a,int x,int y)
{
if(!x&&!y) a.cnt=0,memset(vis,0,sizeof(vis));
a.cnt++,vis[x][y]=1;
for(int i=0;i<4;i++)
{
int tx=x+dx[i],ty=y+dy[i];
if(tx<0||tx>=n||ty<0||ty>=n||a[tx][ty]!=a[x][y]||vis[tx][ty]) continue;
count(a,tx,ty);
}
}
void getlft(node &a)
{
memset(used,0,sizeof(used));
a.lft=-1;
for(int i=0;i<n;i++) for(int j=0;j<n;j++) a.lft+=(!used[a[i][j]]),used[a[i][j]]=1;
}
void dfs(node a,int x)
{
if(a.lft>x) return ;
if(!x)
{
flag=1;
return ;
}
for(int i=0;i<=5&&!flag;i++)
{
if(i==a[0][0]) continue;
node b=a;
color(b,0,0,i),count(b,0,0);
if(b.cnt>a.cnt) getlft(b),dfs(b,x-1);
}
}
void work()
{
int i,j;
node a;
for(i=0;i<n;i++) for(j=0;j<n;j++) scanf("%d",&a[i][j]);
getlft(a),count(a,0,0);
for(flag=0,i=a.lft;i<=60;i++)
{
dfs(a,i);
if(flag)
{
printf("%d\n",i);
return ;
}
}
}
int main()
{
while(1)
{
scanf("%d",&n);
if(!n) return 0;
work();
}
}

【BZOJ3041】水叮当的舞步 迭代深搜IDA*的更多相关文章

  1. bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 44[Submit][Status] Descript ...

  2. bzoj3041 水叮当的舞步 IDA*

    水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 230  Solved: 107[Submit][Status][Discuss] Des ...

  3. Bzoj3041 水叮当的舞步

    Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 132  Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...

  4. [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>

    题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...

  5. codevs 2495 水叮当的舞步

    题目链接:水叮当的舞步 我现在开始发题目链接了(主要还是因为懒得整理题面)-- 这道题一开始是看到MashiroSky在写,于是我也开始写这道题了(说白了就是狙击他)-- 这道题看到这么小的范围当然给 ...

  6. 【IDA*】codevs 2495:水叮当的舞步

    2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...

  7. [codevs2495]水叮当的舞步

    [codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...

  8. BZOJ 3041 水叮当的舞步

    3041: 水叮当的舞步 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 120  Solved: 67[Submit][Status][Discuss ...

  9. 小结:A* & IDA* & 迭代深搜

    概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...

随机推荐

  1. hdu 3501 容斥原理或欧拉函数

    Calculation 2 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  2. 最有用的java面试题

    1.什么是线程局部变量?(答案) 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享.Java 提供 ThreadLocal 类来支持线程局部变量,是一种实现线程安全的方式.但是 ...

  3. windows8.1如何分盘

    磁盘分区首先要弄明白磁盘物理顺序与逻辑顺序的区别,在[磁盘管理]界面,所显示的前后顺序为物理顺序,这是磁盘上实实在在的物理位置,如下图2的电脑磁盘物理顺序为CFDE.在[资源管理器]界面,所显示的顺序 ...

  4. JS对象直接量,数组直接量和函数直接量

    对象直接量创建一个对象: var obj = {x:[1,2],y:23}; 代码跟下面是一样的. var obj=new Object(); obj.x=new Array(1,2); obj.y= ...

  5. 【Windows API】OpenClipboard --- 剪切板(转)

    原文转自 http://www.cnblogs.com/wind-net/archive/2012/11/01/2749558.html 剪切板:系统维护的一个全局公共内存区域.每次只允许一个进程对其 ...

  6. LeetCode OJ--Minimum Path Sum **

    https://oj.leetcode.com/problems/minimum-path-sum/ 对一个grid从左上角到右下角的路径,求出路径中和最小的. 受之前思路的影响,就寻思递归,并且记录 ...

  7. Xamarin.Forms中为WebView指定数据来源Source

    Xamarin.Forms中为WebView指定数据来源Source   网页视图WebView用来显示HTML和网页形式内容.使用这种方式,可以借助网页形式进行界面设计,并利于更新和维护.WebVi ...

  8. luogu P3811 【模板】乘法逆元

    题目背景 这是一道模板题 题目描述 给定n,p求1~n中所有整数在模p意义下的乘法逆元. 输入输出格式 输入格式: 一行n,p 输出格式: n行,第i行表示i在模p意义下的逆元. 输入输出样例 输入样 ...

  9. Java并发容器,底层原理深入分析

    ConcurrentHashMap ConcurrentHashMap底层具体实现 JDK 1.7底层实现 将数据分为一段一段的存储,然后给每一段数据配一把锁, 当一个线程占用锁访问其中一个段数据时, ...

  10. IntelliJ IDEA提示:Class JavaLaunchHelper is implemented in both的错误解决

    这个错误是Mac下特有的,并且据说是一个老Bug,不影响使用. 修复方法: Help->Edit Custom Properties,没有这个properties文件的话,IDEA会提示创建,然 ...