3041: 水叮当的舞步

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 72  Solved: 44
[Submit][Status]

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

 
  这道题与以往不同的是,这道题难点不在于剪枝,而在于常数优化,通过一个特殊的数组记录左上角联通快内部,边界,外部的位置,来消除每次求联通快的时间。
 
  明天NOIP了,时间真的过的太快了,总之while(true)rp++;
 
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define MAXN 9
#define INF 0x3f3f3f3f
int mov[][]={{,},{,},{,-},{-,}};
int n;
int a[MAXN][MAXN];
int g[MAXN][MAXN];
int vis[MAXN][MAXN],bfstime=;
int vis2[];
int q[MAXN*MAXN][];
/*
bool dfs(int chs,int lev)
{
if (!lev)return false;
int i,j;
int old[8];
for (i=0;i<n;i++)
{
old[i]=0;
for (j=0;j<n;j++)
old[i]=old[i]*6+a[i][j];
}
int x,y;
x=0;y=0;
bool ret=false;
int head=-1,tail=0;
int ii;
int c,d;
int nc=0;
for (ii=0;!ret && ii<6;ii++)
{
if (!((1<<ii)&chs))continue;
nc=0;
x=y=0;
c=a[x][y];
a[x][y]=ii;
vis[x][y]=++bfstime;
head=-1;tail=0;
while (head<tail)
{
x=q[++head][0];
y=q[head][1];
for (i=0;i<4;i++)
{
x+=mov[i][0];
y+=mov[i][1];
if (x>=0 && y>=0 && x<n && y<n && vis[x][y]!=bfstime && a[x][y]==c)
{
vis[x][y]=bfstime;
q[++tail][0]=x;
q[tail][1]=y;
a[x][y]=ii;
}
x-=mov[i][0];
y-=mov[i][1];
}
}
head=-1;
while (head<tail)
{
x=q[++head][0];
y=q[head][1];
for (i=0;i<4;i++)
{
x+=mov[i][0];
y+=mov[i][1];
if (x>=0 && y>=0 && x<n && y<n && vis[x][y]!=bfstime)
{
if (a[x][y]==ii)
{
vis[x][y]=bfstime;
q[++tail][0]=x;
q[tail][1]=y;
}else
{
nc|=(1<<a[x][y]);
}
}
x-=mov[i][0];
y-=mov[i][1];
}
}
if (tail==n*n-1)
{
ret=true;
}
head=-1;
// memset(dis,INF,sizeof(dis));
for (i=0;i<=tail;i++)
dis[q[i][0]][q[i][1]]=0;
c=0;
while (head<tail)
{
x=q[++head][0];
y=q[head][1];
d=dis[x][y];
for (i=0;i<4;i++)
{
x+=mov[i][0];
y+=mov[i][1];
if (x>=0 && y>=0 && x<n && y<n && vis[x][y]!=bfstime)
{
vis[x][y]=bfstime;
dis[x][y]=d+1;
x=max(c,d+1);
}
x-=mov[i][0];
y-=mov[i][1];
}
}
d=0;
for (i=0;i<n;i++)
for (j=0;j<n;j++)
if (vis2[a[i][j]]!=bfstime)
{
vis2[a[i][j]]=bfstime;
d++;
}
d--;
c=max(c,d);
if (lev-1>=c && !ret && dfs(nc,lev-1))
{
ret=true;
}
for (i=0;i<n;i++)
{
x=old[i];
for (j=n-1;j>=0;j--)
{
a[i][j]=x%6;
x/=6;
}
}
}
return ret;
}
*/
bool dfs(int lev)
{
if (!lev)return false;
int i,j;
int x,y;
bool ret=false;
int head=-,tail=;
int ii;
int c;
int grec[MAXN][MAXN];
memcpy(grec,g,sizeof(grec));
for (ii=;!ret && ii<;ii++)
{
head=-,tail=-;
++bfstime;
for (i=;i<n;i++)
{
for (j=;j<n;j++)
{
if (g[i][j]== && a[i][j]==ii)
{
q[++tail][]=i;
q[tail][]=j;
vis[i][j]=bfstime;
g[i][j]=;
}
}
}
if (head==tail)continue;
while (head<tail)
{
x=q[++head][];
y=q[head][];
for (i=;i<;i++)
{
x+=mov[i][];
y+=mov[i][];
if (x>= && y>= && x<n && y<n && !g[x][y] )
{
if (a[x][y]==ii)
{
q[++tail][]=x;
q[tail][]=y;
g[x][y]=;
}else
{
g[x][y]=;
}
}
x-=mov[i][];
y-=mov[i][];
}
}
c=;
for (i=;i<n;i++)
for (j=;j<n;j++)
{
if (g[i][j]!= && vis2[a[i][j]]!=bfstime)
{
vis2[a[i][j]]=bfstime;
c++;
}
}
if (!c)
return true;
if (lev->=c && dfs(lev-))
{
ret=true;
}
memcpy(g,grec,sizeof(grec));
}
return ret;
} int main()
{
//reopen("input.txt","r",stdin);
// freopen("output.txt","w",stdout);
while (scanf("%d",&n),n)
{
int i,j;
for (i=;i<n;i++)
for (j=;j<n;j++)
scanf("%d",&a[i][j]);
int l,r;
l=,r=;
int mid;
g[][]=;
while (l+<r)
{
mid=(l+r)>>;
memset(g,,sizeof(g));
g[][]=;
if (dfs(mid))
r=mid;
else
l=mid;
}
printf("%d\n",r-);
}
}

bzoj 3041: 水叮当的舞步 迭代加深搜索 && NOIP RP++的更多相关文章

  1. BZOJ 3041 水叮当的舞步

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

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

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

  3. codevs 2495 水叮当的舞步

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

  4. [codevs2495]水叮当的舞步

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

  5. 【codevs2495】水叮当的舞步

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

  6. 【JZOJ3422】水叮当的舞步

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

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

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

  8. bzoj3041 水叮当的舞步 IDA*

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

  9. BZOJ 1085 骑士精神 迭代加深搜索+A*

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1085 题目大意: 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个 ...

随机推荐

  1. Java中PreparedStatement和Statement的用法区别(转)

    1. PreparedStatement接口继承Statement, PreparedStatement 实例包含已编译的 SQL 语句,所以其执行速度要快于 Statement 对象.   2.作为 ...

  2. 数据结构与算法/leetcode/lintcode题解

    http://algorithm.yuanbin.me/zh-hans/index.html

  3. rpm安装mysql 默认安装目录

    MySQL安装完成后不象SQL Server默认安装在一个目录,它的数据库文件.配置文件和命令文件分别在不同的目录,了解这些目录非常重要,尤其对于Linux的初学者,因为Linux本身的目录结构就比较 ...

  4. C#实现Ruby的负数索引器

    public class InvertibleList<T> : List<T> { public new T this[int index] { get { ) return ...

  5. Android开发手记(18) 数据存储三 SQLite存储数据

    Android为数据存储提供了五种方式: 1.SharedPreferences 2.文件存储 3.SQLite数据库 4.ContentProvider 5.网络存储 SQLite 是以嵌入式为目的 ...

  6. 黑马入学基础测试(三)求斐波那契数列第n项,n<30,斐波那契数列前10项为 1,1,2,3,5,8,13,21,34,55

    .获得用户的输入 计算      3打印就行了.   这里用到了java.util.Scanner   具体API  我就觉得不常用.解决问题就ok了.注意的是:他们按照流体的方式读取.而不是刻意反复 ...

  7. Windows环境下使用Cmake ndk编译fdk-aac

     一.废话 最近学习,第一步就是编译.我们需要编译FFmpag,x264,fdk_aac,下面是x264,网上说的很多都是几百年前的,我亲测完美可用 还是那句话 我能力有限,但是我希望我写的东西能够让 ...

  8. C#缓存处理

    第一种方式: 在ASP.NET中页面缓存的使用方法非常的简单,只需要在aspx页的顶部加这样一句声明即可: <%@ OutputCache Duration="60" Var ...

  9. 解决IE无法解析json的方法

    一.原始方法eval() 二.json插件--github开源插件:json-js/json2.js https://github.com/douglascrockford/JSON-js/blob/ ...

  10. 读书笔记之 - javascript 设计模式 - 代理模式

    代理(proxy)是一个对象,它可以用来控制对另一对象的访问.它与另外那个对象实现了同样的接口,并且会把任何方法调用传递给那个对象.另外那个对象通常称为本体.代理可以代替本体被实例化,并使其可被远程访 ...