【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的优化,因此放 ...
随机推荐
- 浅谈HookSSDT和和Resume(恢复)SSDT
最近在学HookSSDT和针对Hook的ResumeSSDT,避免自己理解有所偏差,把它们写出来,希望大家不吝赐教.(虽然已经是过时了的技术,但是最起码了解其中的原理,嘿嘿嘿.) 转载注明出处:ht ...
- Codeforces 536C Tavas and Pashmaks(凸壳)
题目链接 Tavas and Pashmaks 题目大意:n个人比赛,游泳和赛跑,游泳距离S,赛跑R.每个人对应两个速度(陆地和水上的),如果存在S,R,使得第i个人胜利,那么输出i 题目要求输出所有 ...
- codeforces 997E(线段树)
分析: 首先考虑如何计算整个数组有多少个good区间 容易发现一个区间是good区间当且仅当max-min-len=-1,且任意区间max-min-len>=-1 我们可以枚举右端点,然后维护前 ...
- HtmlEmail实现简单发送邮件
一般发送邮件的话系统项目中可能会用到,像一些通知信息自动发送等,会用到发送邮件的情况,发送邮件有好多种,包括设置各种格式,添加图片附件等,当然今天我们先看一下怎么实现发送成功. 工欲善其事必先利其器, ...
- xcopy中文文件名,中文件目录乱码问题
1.保存成bat脚本文件 2.且该bat文件不能使用utf-8格式,使用ANSI即正常
- :jQuery实例【DEMO】
前言: 今天2月最后一天,写一篇jQuery的几个实例,算是之前前端知识的应用.写完这篇博客会做一个登陆界面+后台管理(i try...) 一.菜单实例 最开始的界面: 点击菜单三后的界面: 二. ...
- Cesium 显示CZML数据
转自文章 Cesium随笔(5)CZML介绍(介个文章是转的嘿嘿) 通过czml可以在cesium上实现非常棒的动态效果 CZML的结构 CZML是一种用来描述动态场景的JSON架构的语言,主 ...
- Excel导入的HDR=YES; IMEX=1详解
参数HDR的值:HDR=Yes,这代表第一行是标题,不做为数据使用 ,如果用HDR=NO,则表示第一行不是标题,做为数据来使用.系统默认的是YES 参数Excel 8.0对于Excel 97以上版本都 ...
- DICOM:DICOM万能编辑工具之Sante DICOM Editor
版权声明:本文为zssure原创文章,转载请注明出处,未经允许不得转载. 目录(?)[-] 背景 DICOM Service的配置 Sante DICOM Editor自启动的服务 PACS查询下 ...
- linux mysql-server can't find mysql_config
linux mysql-server can't find mysql_config Ask Question up vote7down votefavorite 3 I have a running ...