description

水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。

为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~

地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。

水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,地毯左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。

由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。


analysis

  • 正解\(IDA*\),涨知识了

  • \(IDDFS\)就是迭代加深搜索,具体就是限制搜索树的深度,听着慢但很快

  • \(A*\)就是由当前步数加上估价函数来搜索,通常用堆实现

  • 首先每次搜索前把图染色,\(1\)标记当前颜色的联通块,\(2\)标记当前颜色联通块外边界上的点,剩下点标记\(0\)

  • 估价函数取剩下与当前联通块颜色不同的颜色数量,若为\(0\)即整张图已经被染成一种颜色

  • 如果当前步数加估价函数大于限制的深度,就\(return\)

  • 搜索中枚举一种颜色染色,如果联通块大小没有变化,那这次染色就没有意义

  • 这样就可以解决问题了,那么以后还要多掌握一些偏门知识


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll fx[4]={0,0,1,-1},fy[4]={1,-1,0,0};
ll a[10][10],b[10];
ll bz[10][10];
bool flag;
ll n,ans; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void color(ll x,ll y,ll z)
{
bz[x][y]=1;
fo(i,0,3)
{
ll xx=x+fx[i],yy=y+fy[i];
if (xx<1 || xx>n || yy<1 || yy>n || bz[xx][yy]==1)continue;
bz[xx][yy]=2;
if (a[xx][yy]==z)color(xx,yy,z);
}
}
inline ll H()
{
ll tmp=0;
memset(b,0,sizeof(b));
fo(i,1,n)fo(j,1,n)if (bz[i][j]!=1 && !b[a[i][j]])b[a[i][j]]=1,++tmp;
return tmp;
}
inline bool judge(ll x)
{
ll tmp=0;
fo(i,1,n)fo(j,1,n)if (a[i][j]==x && bz[i][j]==2){++tmp,color(i,j,x);}
return tmp>0;
}
inline bool a_star(ll x)
{
ll tmp=H(),t[10][10];
if (tmp==0)return 1;
else if (tmp+x>ans)return 0;
fo(i,0,5)
{
memcpy(t,bz,sizeof(t));
if (judge(i) && a_star(x+1))return 1;
memcpy(bz,t,sizeof(bz));
}
return 0;
}
int main()
{
freopen("T1.in","r",stdin);
for (n=read();n!=0;n=read())
{
memset(bz,0,sizeof(bz)),flag=0;
fo(i,1,n)fo(j,1,n)a[i][j]=read();
color(1,1,a[1][1]);
for (ans=0;ans<=n*n;++ans)if (a_star(0))break;
printf("%lld\n",ans);
}
return 0;
}

【JZOJ3422】水叮当的舞步的更多相关文章

  1. codevs 2495 水叮当的舞步

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

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

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

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

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

  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. BZOJ 3041 水叮当的舞步

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

  8. Bzoj3041 水叮当的舞步

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

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

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

随机推荐

  1. Java中在磁盘上复制文件

    使用字节流实现 public static void main(String[] args) throws IOException { InputStream in = new FileInputSt ...

  2. 无法CREATE UNIQUE INDEX;找到重复的关键字

  3. 2019-10-15-从以前的项目格式迁移到-VS2017-新项目格式

    title author date CreateTime categories 从以前的项目格式迁移到 VS2017 新项目格式 lindexi 2019-10-15 14:9:27 +0800 20 ...

  4. WordTEX

    https://www.andrew.cmu.edu/user/twildenh/wordtex/

  5. boost asio tcp 多线程

    common/pools.h // common/pools.h #pragma once #include <string> #include <boost/pool/pool.h ...

  6. 毫秒数转date

    毫秒数转date var date=new date(毫秒数);

  7. ES6 Sybol属性

    Symbol: 概念:ES6中的添加了一种原始数据类型symbol(已有的原始数据类型:String, Number, boolean, null, undefined, 对象) 特点: 1.Symb ...

  8. MaxCompute问答整理之9月

    本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助. 问题一.如何查看information_schema的tables? 在使用OD ...

  9. LeetCode 1019. Next Greater Node In Linked List (链表中的下一个更大节点)

    题目标签:Linked List, Stack 题目给了我们一个 Linked List,让我们找出对于每一个数字,它的下一个更大的数字. 首先把 Linked List 里的数字 存入 ArrayL ...

  10. class7_Checkbutton 勾选项

    最终的运行效果(程序见序号3):   #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------ ...