【NOIP2013模拟】水叮当的舞步
题目
水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变。
为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈的舞来卖萌~~~
地毯上的格子有N行N列,每个格子用一个0~5之间的数字代表它的颜色。
水叮当可以随意选择一个0~5之间的颜色,然后轻轻地跳动一步,地毯左上角的格子所在的联通块里的所有格子就会变成她选择的那种颜色。这里连通定义为:两个格子有公共边,并且颜色相同。
由于水叮当是施展轻功来跳舞的,为了不消耗过多的真气,她想知道最少要多少步才能把所有格子的颜色变成一样的。
分析
我们迭代加深,枚举答案限制,
BFS枚举每次选择哪种颜色,当枚举次数超过限制,就退出。否则如果BFS出答案就输出。
这样只能拿10分,
加上IDA,估价函数为图中大颜色数减一,
当枚举的深度加上估价函数大于限制就退出,
接着发现在枚举左上角所在的联通快时很浪费时间,
我们用一个一个NN的v标记数组。左上角的格子所在的联通块里的格子为1,左上角联通块周围一格的格子为2,其它格子都为为0。如果某次选择了颜色c,我们只需要找出标记为2并且颜色为c的格子,向四周扩展,再修改v标记,就可以不断修改标记,但所有格子都为1,就是答案了。
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
const int maxlongint=2147483647;
using namespace std;
int n,m,ans;
int z1[4][2]={{1,0},{0,1},{-1,0},{0,-1}},f,a[9][9],t;
int mark[9][9];
bool colour[6];
int makeh()
{
int h1=0;
memset(colour,true,sizeof(colour));
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if((mark[i][j]!=1 && colour[a[i][j]]))
{
colour[a[i][j]]=false;
h1++;
}
}
return h1;
}
void put(int x,int y,int z)
{
mark[x][y]=1;
for(int i=0;i<=3;i++)
{
int xx=x+z1[i][0],yy=y+z1[i][1];
if((xx<1 || yy<1 || xx>n || yy>n || mark[xx][yy]==1)) continue;
if(a[xx][yy]==z)
put(xx,yy,z);
else
mark[xx][yy]=2;
}
}
bool q(int color)
{
bool p=false;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
if((mark[i][j]==2 && a[i][j]==color))
{
p=true;
put(i,j,color);
}
}
return !p;
}
void dg(int g)
{
int h=makeh();
if(!h)
{
t=true;
return;
}
if(g+h>f) return;
int copy1[9][9];
memcpy(copy1,mark,sizeof(copy1));
for(int color=0;color<=5;color++)
{
if(!q(color) && !t)
dg(g+1);
memcpy(mark,copy1,sizeof(mark));
}
}
int main()
{
while(1)
{
scanf("%d",&n);
if(!n) break;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
scanf("%d",&a[i][j]);
}
memset(mark,0,sizeof(mark));
put(1,1,a[1][1]);
for(f=0;;f++)
{
t=0;
dg(0);
if(t)
break;
}
printf("%d\n",f);
}
}
【NOIP2013模拟】水叮当的舞步的更多相关文章
- codevs 2495 水叮当的舞步
题目链接:水叮当的舞步 我现在开始发题目链接了(主要还是因为懒得整理题面)-- 这道题一开始是看到MashiroSky在写,于是我也开始写这道题了(说白了就是狙击他)-- 这道题看到这么小的范围当然给 ...
- 【IDA*】codevs 2495:水叮当的舞步
2495 水叮当的舞步 题目描述 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上 ...
- bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 72 Solved: 44[Submit][Status] Descript ...
- 【BZOJ3041】水叮当的舞步 迭代深搜IDA*
[BZOJ3041]水叮当的舞步 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变.为了讨好她的偶像虹猫,水叮当决定在地毯上跳 ...
- [codevs2495]水叮当的舞步
[codevs2495]水叮当的舞步 试题描述 水叮当得到了一块五颜六色的格子形地毯作为生日礼物,更加特别的是,地毯上格子的颜色还能随着踩踏而改变. 为了讨好她的偶像虹猫,水叮当决定在地毯上跳一支轻盈 ...
- bzoj3041 水叮当的舞步 IDA*
水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 230 Solved: 107[Submit][Status][Discuss] Des ...
- BZOJ 3041 水叮当的舞步
3041: 水叮当的舞步 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 120 Solved: 67[Submit][Status][Discuss ...
- Bzoj3041 水叮当的舞步
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 132 Solved: 75 Description 水叮当得到了一块五颜六色的格子形地毯作为生日礼物 ...
- 【wikioi】2495 水叮当的舞步(IDA*)
http://wikioi.com/problem/2495/ 这题我还是看题解啊囧.(搜索实在太弱.完全没想到A*,还有看题的时候想错了,.,- -) 好吧,估价还是那么的简单,判断颜色不同的数目即 ...
随机推荐
- AGC035 A - XOR Circle【分析】
题目传送门 题意简述: (就是连环的意思) 唔,这道题考场上写了个什么神仙做法,数据太水了居然过了: // #include<cstdio> #include<algorithm&g ...
- ubuntu/work
1.Ubuntu16.04 创建桌面快捷方式 cd /usr/share/applications vim goland.desktop ##add content [Desktop Entry] E ...
- 基于element表格的合并多个行实例
官方示例地址:https://github.liubing.me/lb-element-table/zh/guide/ 效果图: 0.下载lb-table 并引入 import LbTable fro ...
- jmeter-在beanshell里用代码提取参数
接口返回json(response_data): { "Code":1, "Message":null, "Error":null, &qu ...
- 第八周课程报告&&实验报告六
Java实验报告 班级 计科一班 学号 20188390 姓名 宋志豪 实验四 类的继承 实验目的 理解异常的基本概念: 掌握异常处理方法及熟悉常见异常的捕获方法. 实验要求 练习捕获异常.声明异常. ...
- neo4j - 查询效率的几种优化思路
最近在公司实习做的就是优化neo4j图形数据库查询效率的事,公司提供的是一个在Linux上搭建且拥有几亿个节点的数据库.开始一段时间主要是熟悉该数据库的一些基本操作,直到上周才正式开始步入了优化数据库 ...
- POJ 2492 A Bug's Life 题解
题面 这道题是一道标准的种类并查集: 种类并查集是给每个结点一个权值.然后在合并和查找的时候根据情况对权值来进行维护. 通过将原有的区间范围变大使并查集可以维护种类的联系: #include < ...
- 关于float的小奥秘
一. float 存储方式 1.1. float 占四个字节 1.2. 浮点数构成 1.2.1. 无论是单精度还是双精度在存储中都分为三个部分: <1>. 符号位(Sign) : 0代表正 ...
- MD5算法+盐Salt
1.MD算法的基的概念 MD5算法是典型的消息摘要算法,其前身有MD2.MD3和MD4算法,它由MD4.MD3和MD2算法改进而来.不论是哪一种MD算法,它们都需 要获得一个随机长度的信息并产生 ...
- [JavaScript] es6规则总结
let 和 const let 是块级作用域 let 声明的变量只在其所在的作用域内生效 <script> { var today = "周3"; let yester ...