【BZOJ3041】水叮当的舞步 迭代深搜IDA*
【BZOJ3041】水叮当的舞步
Description
水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~
地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。
Input
每个测试点包含多组数据。
每组数据的第一行是一个整数N,表示地摊上的格子有N行N列。
接下来一个N*N的矩阵,矩阵中的每个数都在0~5之间,描述了每个格子的颜色。
N=0代表输入的结束。
Output
对于每组数据,输出一个整数,表示最少步数。
Sample Input
0 0
0 0
3
0 1 2
1 1 2
2 2 1
0
Sample Output
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*的更多相关文章
- bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 72 Solved: 44[Submit][Status] Descript ...
- bzoj3041 水叮当的舞步 IDA*
水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 230 Solved: 107[Submit][Status][Discuss] Des ...
- Bzoj3041 水叮当的舞步
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 132 Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...
- [vijos1159&洛谷1494]岳麓山上打水<迭代深搜>
题目链接:https://vijos.org/p/1159 https://www.luogu.org/problem/show?pid=1494 这是今天的第三道迭代深搜的题,虽然都是迭代深搜的模板 ...
- codevs 2495 水叮当的舞步
题目链接:水叮当的舞步 我现在开始发题目链接了(主要还是因为懒得整理题面)-- 这道题一开始是看到MashiroSky在写,于是我也开始写这道题了(说白了就是狙击他)-- 这道题看到这么小的范围当然给 ...
- 【IDA*】codevs 2495:水叮当的舞步
2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...
- [codevs2495]水叮当的舞步
[codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...
- BZOJ 3041 水叮当的舞步
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 120 Solved: 67[Submit][Status][Discuss ...
- 小结:A* & IDA* & 迭代深搜
概要: 在dfs中,如果答案的深度很小但是却很宽,而且bfs还不一定好做的情况下,我们就综合bfs的优点,结合dfs的思想,进行有限制的dfs.在这里A*.IDA*和迭代深搜都是对dfs的优化,因此放 ...
随机推荐
- 转 new和malloc的区别
传送门 new和malloc的区别 1. malloc()函数 1.1 malloc的全称是memory allocation,中文叫动态内存分配. 原型:extern void *malloc(un ...
- nVidia的物理系统
PhysX PhysX(wiki en 中文,physx wiki physx wiki2)是nVidia公司一款跨平台实时物理引擎,可使用硬件(GPU.PPU: Physics Process ...
- android 什么时候call super.onDestory()等
Methods you override that are part of component creation (onCreate(), onStart(), onResume(), etc.), ...
- Usaco_Contest_2013_Open_Bovine Problem 1. Bovine Ballet
Problem 1: Bovine Ballet [Brian Dean, 2013] In an attempt to challenge the stereotypical perception ...
- java webservice wsimport 无法将名称 'soapenc:Array' 解析为 'type definition' 组件 时对应的解决方法
(一):代码如下: package com.enso.uploaddata; import org.apache.axis.client.Call; import org.apache.axis.cl ...
- iOS开发 解决使用AVAudioRecorder录制后转mp3解决音量小的问题
使用AVAudioRecorder录音后使用avplayer播放声音小,录音完后转成mp3格式的音频声音也小!!! 老板要求最基本的是不用把手机放到耳边听! 在StackOverFlow上查了一下,加 ...
- Delphi图像处理 -- 文章索引
转载:http://blog.csdn.net/maozefa/article/details/7188354 本文对已发布<Delphi图像处理>系列文章进行索引链接,以方便阅读和查找. ...
- 【OpenGL】OpenGL帧缓存对象(FBO:Frame Buffer Object) 【转】
http://blog.csdn.net/xiajun07061225/article/details/7283929/ OpenGL Frame BufferObject(FBO) Overview ...
- windows环境下生成ssh keys
参考:https://www.cnblogs.com/achengmu/p/6095046.html 1.首先你要安装Git工具 2.运行Git Bash here 3.输入指令,进入.ssh文件夹 ...
- python(7)- 小程序练习:循环语句for,while实现99乘法表
打印99乘法表 for 循环语句实现: for i in range(1,10): for j in range(1,10): print(j,"x",i,"=" ...