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. POJ 1182 (经典食物链 /并查集扩展)

    (參考他人资料) 向量偏移--由"食物链"引发的总结 http://poj.org/problem?id=1182这道食物链题目是并查集的变型.非常久曾经做的一次是水过的,这次 ...

  2. 在android客户端加载html源代码总结

    在实际应用中,客户端要从网页上获取数据是常见的事,如果要解析网页上的html文档,那么首先得获取html源码,然后现在一般使用Jsoup来转换成Document文档来进行解析,本文主要讨论如何使用Js ...

  3. keepalive support-----Programming applications

    TCP Keepalive HOWTO Prev   Next 4. Programming applications This section deals with programming code ...

  4. centos 6.6编译安装nginx--来自阿里云帮助文档

    刚开始接触运维工作, 需要安装nginx,就在网上找了各种的方法, 结果都是大家抄来抄去,都不好用. 由于公司用的是阿里云的服务器, 所以在阿里云上找到了安装nginx的方法,现在摘抄下来,供大家借鉴 ...

  5. Java基础知识强化之网络编程笔记09:TCP之客户端键盘录入服务器写到文本文件中

    1. TCP之客户端键盘录入服务器写到文本文件中 (1)客户端: package cn.itcast_09; import java.io.BufferedReader; import java.io ...

  6. IT技能栈

    C++.JAVA.Objective-C 基本数据类型,集合类如字符串数组字典,自定义数据对象 内存布局,编译运行期的变化 语言特性 输入输出流,文件流,序列化 多线程,并发控制,线程池,锁 网络编程 ...

  7. JavaScript入门(1)

    一.JS基本 1.JS代码位置 <script type="text/javascript">表示: <script></script>之间是文 ...

  8. Mysql INNER,LEFT ,RIGHT join的使用

    JOIN 按照功能大致分为如下三类: INNER JOIN(内连接,或等值连接):获取两个表中字段匹配关系的记录. LEFT JOIN(左连接):获取左表所有记录,即使右表没有对应匹配的记录. RIG ...

  9. Asp.net Mvc对比Php的4大误解

    一:asp.net技术已过时,Php技术更新 Asp.net mvc 5 发布于2014 夏天. 二:php开发者更多,所以更能得到帮助 2者对比犹如下图,会拿电锯的肯定多少会点锯子, 会用锯子的不一 ...

  10. xp和win 2003远程桌面强制进入命令

    xp和win 2003远程桌面强制进入命令 注意:端口号也可以不写 如果是在win 2003里面进行踢人的话可以用命令: mstsc /console /v:172.25.100.27:3389 如果 ...