3041: 水叮当的舞步

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 120  Solved: 67
[Submit][Status][Discuss]

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组数据。

HINT

 

Source

题解:

IDA*

比较简单的A* 估价函数很简单就是除了左上角的联通快之外的不同的个数
加上迭代,dfs就好了

10s时间很宽裕

AC代码:

(codevs80-90分)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
inline const int read(){
register int x=,f=;
register char ch=getchar();
while(ch<''||ch>'') ch=getchar();
return ch-'';
}
const int dx[]={,,,-};
const int dy[]={,-,,};
const int N=;
int n,g[N][N],a[N][N];
bool flag,vis[N][N],mark[N];
inline void calc(int &c){
memset(mark,,sizeof mark);
c=;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
if(!mark[a[i][j]]){
mark[a[i][j]]=;
c++;
}
}
}
}
void go(int x,int y,int c,int r){
a[x][y]=r;
vis[x][y]=;
for(int i=;i<;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(!vis[nx][ny]&&nx>&&nx<=n&&ny>&&ny<=n&&a[nx][ny]==c){
go(nx,ny,c,r);
}
}
}
void get_round(int x,int y,int c,int round[]){
vis[x][y]=;
for(int i=;i<;i++){
int nx=x+dx[i];
int ny=y+dy[i];
if(!vis[nx][ny]&&nx>&&nx<=n&&ny>&&ny<=n){
if(a[nx][ny]==c) get_round(nx,ny,c,round);
else if(!round[a[nx][ny]]) round[a[nx][ny]]=;
}
}
}
void dfs(int now,int sum){
if(flag) return ;
int C;
calc(C);
if(now==sum){
if(C==) flag=;
return ;
}
if(now+C->sum) return ;
memset(vis,,sizeof vis);
int round[N]={};
get_round(,,a[][],round);
for(int i=;i<=;i++){
if(i==a[][]||!round[i]) continue;
int back[N][N];
memcpy(back,a,sizeof a);
memset(vis,,sizeof vis);
go(,,a[][],i);
if(flag) return ;
dfs(now+,sum);
memcpy(a,back,sizeof back);
}
}
int main(){
for(;;){
n=read();
if(!n) break;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
g[i][j]=read();
}
}
int ans=;
for(int k=;k<=;k++){
memcpy(a,g,sizeof g);
flag=;
dfs(,k);
if(flag){
ans=k;
break;
}
}
printf("%d\n",ans);
}
return ;
}

BZOJ 3041 水叮当的舞步的更多相关文章

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

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

  2. codevs 2495 水叮当的舞步

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

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

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

  4. 【BZOJ3041】水叮当的舞步 迭代深搜IDA*

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

  5. [codevs2495]水叮当的舞步

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

  6. bzoj3041 水叮当的舞步 IDA*

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

  7. Bzoj3041 水叮当的舞步

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

  8. 【wikioi】2495 水叮当的舞步(IDA*)

    http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...

  9. 「Poetize5」水叮当的舞步

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

随机推荐

  1. vue 封装自定义组件

    组件结构 sjld >index.js >sjid.vue 最好单独放一个文件夹,有依赖的话装依赖 Sjld.vue 内容 <template id="sjld" ...

  2. 20181228 模拟赛 T3 字符串游戏 strGame 博弈论 字符串

    3  字符串游戏(strGame.c/cpp/pas) 3.1  题目描述 pure 和 dirty 决定玩 T 局游戏.对于每一局游戏,有n个字符串,并且每一局游戏由K轮组成.具体规则如下:在每一轮 ...

  3. ubuntu环境安装docker

    查看已安装的docker apt list docker* 如果已安装,并且需要卸载,则执行以下命令: apt remove docker* 更新apt索引 apt update apt需要支持HTT ...

  4. 读书笔记:《人有人的用处》------N.维纳. (2016.12.28)

    读书笔记:<人有人的用处>------N.维纳 ·某些系统可以依其总能量而和其他系统区别开来. ·在某些情况下,一个系统如果保持足够长时间的运转,那它就会遍历一切与其能量相容的位置和动量的 ...

  5. MyBatis 多参问题

    当传入的参数为多个参数时 1 可以不封装为Javabean直接传入,写法如下 public List<XXXBean> getXXXBeanList(String xxId, String ...

  6. 牛客网NOIP赛前集训营 第6场 T1 最长路

    [题解] 先建反向图,然后跑拓扑排序求出最长路. 将所有的点按照最长路从小到大分层,把上一层连向这一层的边按照边权为第一关键字.起点的排名为第二关键字排序. 按照这个顺序更新这一层的答案,按照这一层每 ...

  7. mat 服务器分析大堆,本地打开

    1:服务器执行nohup sh /usr/local/mat/ParseHeapDump.sh es9.bin org.eclipse.mat.api:suspects org.eclipse.mat ...

  8. jar项目 BeanDefinitionParsingException: Configuration problem:Unable to locate Spring NamespaceHandler for XML schema namespace

    最近由于项目需要,需要jar项目来处理. 我在项目中整合了Spring,在编辑器中启动没有问题,但是使用ant打包为一个完整jar文件,部署后启动报错如下 org.springframework.be ...

  9. C51 蜂鸣器 个人笔记

    音调:频率 音量:高低电平占空比 有源:上面没有加号,只需高低电平即可发声 无源:上面有加号,不仅要电平,还要, 的频率 这里的有源不是指电源的"源",而是指有没有自带震荡电路,有 ...

  10. Rikka with Phi 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...