codevs2495 水叮当的舞步(IDA*)
2495 水叮当的舞步
水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~
地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。
每个测试点包含多组数据。
每组数据的第一行是一个整数N,表示地摊上的格子有N行N列。
接下来一个N*N的矩阵,矩阵中的每个数都在0~5之间,描述了每个格子的颜色。
N=0代表输入的结束。
对于每组数据,输出一个整数,表示最少步数。
2
0 0
0 0
3
0 1 2
1 1 2
2 2 1
0
0
3
对于30%的数据,N<=5
对于50%的数据,N<=6
对于70%的数据,N<=7
对于100%的数据,N<=8,每个测试点不多于20组数据。
第二组样例解释:
0 1 2 1 1 2 2 2 2 1 1 1
1 1 2 --> 1 1 2 --> 2 2 2 --> 1 1 1
2 2 1 2 2 1 2 2 1 1 1 1
来源:Nescafe 21
分类标签 Tags
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int s,n,map[9][9]; int xx[4]={1,-1,0,0},yy[4]={0,0,-1,1}; bool ans; bool judans() {int t=map[1][1];for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(map[i][j]!=t)return 0;return 1; } void change(int a,int b,int x,int y) {map[a][b]=y;for(int i=0;i<4;i++){int nowx=a+xx[i],nowy=b+yy[i];if(nowx<1||nowy<1||nowx>n||nowy>n)continue;if(map[nowx][nowy]==x)change(nowx,nowy,x,y);} } void dfs(int now) {if(now==s){if(judans())ans=1;return;}if(ans)return;for(int c=0;c<=5;c++){int a[9][9];if(map[1][1]==c) continue;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)a[i][j]=map[i][j];change(1,1,map[1][1],c);dfs(now+1);for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)map[i][j]=a[i][j];} } int main() {while(1){scanf("%d",&n);ans=0;if(n==0)break;for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)scanf("%d",&map[i][j]);for(s=0;;s++){dfs(0);if(ans){printf("%d\n",s);break;}}}return 0; }
暴力
/* 左上角的格子所在的联通块里的格子标记为1。左上角联通块周围一圈格子标记为2, 其它格子标记为0。如果某次选择了颜色c, 只需要找出标记为2并且颜色为c的格子,向四周扩展 ,并相应地修改v标记,就可以不断扩大标记为1的区域, 最终如果所有格子标记都是1 */ #include<iostream> #include<cstring> #include<cstdio>using namespace std; int s,n,map[9][9],mark[9][9]; int xx[4]= {1,-1,0,0},yy[4]= {0,0,-1,1},used[6]; bool ans;int get() {int t=0;memset(used,0,sizeof(used));for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)if(!used[map[i][j]]&&mark[i][j]!=1){used[map[i][j]]=1;t++;}return t; }void dfs(int a,int b,int x) {mark[a][b]=1;for(int i=0; i<4; i++){int nowx=a+xx[i],nowy=b+yy[i];if(nowx<1||nowy<1||nowx>n||nowy>n||mark[nowx][nowy]==1)continue;mark[nowx][nowy]=2;if(map[nowx][nowy]==x)dfs(nowx,nowy,x);} }int fill(int x) {int t=0;for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)if(mark[i][j]==2&&map[i][j]==x) {t++;dfs(i,j,x);}return t; }void search(int k) {int v=get();if(!v)ans=1;if(k+v>s||ans)return;int temp[10][10];for(int i=0; i<=5; i++){memcpy(temp,mark,sizeof(mark));if(fill(i))search(k+1);memcpy(mark,temp,sizeof(mark));} }int main() {while(1){memset(mark,0,sizeof(mark));scanf("%d",&n);ans=0;if(n==0)break;for(int i=1; i<=n; i++)for(int j=1; j<=n; j++)scanf("%d",&map[i][j]);dfs(1,1,map[1][1]);for(s=0;;s++){search(0);if(ans){printf("%d\n",s); break;}}}return 0; }
转载于:https://www.cnblogs.com/L-Memory/p/7410885.html
codevs2495 水叮当的舞步(IDA*)相关推荐
- CodeVS2495 水叮当的舞步
标签:IDA* 题目 题目传送门 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决 ...
- 水叮当的舞步(IDA*)(2019-中山集训)[NOIP2013模拟]
文章目录 前言 题目 做法 前言 这个算法很久没有遇到了- 题目 codevs-传送门 做法 IDA*,每次放宽 MaxdMaxdMaxd,可以用一个cnt记录每种数字的个数,则启发式函数hhh可设置 ...
- 【IDA*】codevs 2495:水叮当的舞步
2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...
- [GMOJ]水叮当的舞步 From lydrainbowcat
水叮当的舞步 From lydrainbowcat 类型:IDA* (迭代加深启发式搜索) 方法一: 枚举每次选取了哪种颜色,然后找出左上角的格子所在的联通块,改变颜色. 为了避免来回改变.搜索深度过 ...
- 3422. 【NOIP2013模拟】水叮当的舞步
Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 地毯上 ...
- 【BZOJ】T3041 水叮当的舞步
题目链接: CODEVS 2495 水叮当的舞步 BZOJ 3041: 水叮当的舞步 这是道IDA*,迭代加深+估价剪枝: 首先考虑估价函数,一般情况下我们把易于计算的操作次数的下限作为A*的估价函数 ...
- [NOIP2013模拟]水叮当的舞步(暴力,IDA*)
题面 题目描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~ 地毯上的格子有 ...
- 【codevs2495】水叮当的舞步
题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~ ...
- 【wikioi】2495 水叮当的舞步(IDA*)
http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...
最新文章
- 算法设计与分析 贪心算法
- 【笔记篇】C#笔记1
- 【数字信号处理】相关函数应用 ( 高斯白噪声 的 自相关函数 分析 )
- 统计0到n之间1的个数
- linux 基本的操作
- 书里书外丨大咖论“赛”:阿里云天池 TOP 选手不得不说的那些事儿
- es搜索准实时的理解
- qq空间认证教程:借助企鹅媒体平台认证QQ公众空间
- mysql怎么查看记录时间戳_mysql TIMESTAMP(时间戳)详解——查询最近一段时间操作的记录...
- 用Visual Studio调试asp程序
- Java_接口练习题
- 什么是DC-DC转换器?DC-DC转换器是如何命名的?
- 前端HTML银行管理系统界面部分实现
- 入门力扣自学笔记96 C++ (题目编号749)
- 目前上海最便宜的企业宽带-199元的旺铺通B1套餐
- matlab 拟合光滑曲线图,Matlab光滑曲线多项式拟合与样条曲线拟合的两个案例
- SMTP 协议邮件发送工具封装
- PTA题目 计算分段函数[3]
- Java 操作数据库插入失败原因
- 百度地图电子围栏判断
热门文章
- 大一计算机实验报告免费复制,大一计算机实验报告_相关文章专题_写写帮文库...
- 鲸会务智慧景区管理解决方案
- 服务器没有plugin文件,服务器上安装插件
- wp-login.php 404页面,wordpress404页面制作完整的正确操作流程
- Windows10如何滑动关机(与以前不一样的方式)
- 重整晋商雄风,再现汇通天下 -------《晋商》阅读笔记第1-4章
- python基础实例教程 微课版-从零开始学Python(微课视频版)
- python毕业设计作品基于django框架 电影院购票选座系统毕设成品(7)中期检查报告
- Twipstopixels java_Access量度单位缇与像素,厘米等的换算关系
- 【keras】python mnist_mlp.py下载数据集mnist.npz失败的解决