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. 九度OJ 题目1384:二维数组中的查找

    /********************************* * 日期:2013-10-11 * 作者:SJF0115 * 题号: 九度OJ 题目1384:二维数组中的查找 * 来源:http ...

  2. Android菜单详解(四)——使用上下文菜单ContextMenu

    之前在<Android菜单详解(二)——创建并响应选项菜单>和<Android菜单详解(三)——SubMenu和IconMenu>中详细讲解了选项菜单,子菜单和图标菜单.今天接 ...

  3. C# 网络编程之网页自动登录 (一).使用WebBrower控件模仿登录

    最近学习C#网络编程中,想实现网页自动登录并提交GET/POST信息,再实现循环登录不断发送报文给服务器,服务器发送消息给客户端记录能登录的账户和密码,做到后面实现绕过验证码.动态抓取登录位置等,但由 ...

  4. SecureCRT使用教程

    Secure CRT是一款支持 SSH2.SSH1.Telnet.Telnet/SSH.Relogin.Serial.TAPI.RAW 等协议的终端仿真程序,最吸引我的是,SecureCRT 支持标签 ...

  5. Day02 - Python 基本数据类型

    1 基本数据类型 Python有五个标准的数据类型: Numbers(数字) String(字符串) List(列表) Tuple(元组) Dictionary(字典) 1.1 数字 数字数据类型用于 ...

  6. 初建FreeMarker工程

    初建FreeMarker工程 ——@梁WP 背景:听说freemarker可以用来写页面的组件,热衷于编写可重用代码的我,迫不及待地研究了freemarker,不过,在写组件之前,还是先研究一下fre ...

  7. .net+easyui系列--datagrid

    加载CSS <link href="../../Public/easyui/SiteEasy.css" rel="stylesheet" type=&qu ...

  8. PHP中的strtotime()对于31日求上个月有问题

    原文出处 <?php $date = "2012-07-31"; $date_unix = strtotime($date); $lastmonth = strtotime( ...

  9. 26、Jquery 基础

    什么是Jquery? Jquery是一套Javascript脚本库. 使用时需要先下载下来,并引用到项目中. 下载地址:http://jquery.com/download/ 目前jquery分为 1 ...

  10. 【转】[转]order by 1是什么意思?

    [转][转]order by 1是什么意思? ORDER BY 1 表示 所select 的字段按第一个字段排序 ORDER BY ASC应该没有这样写法,ORDER BY 后面不是字段就是数字, 可 ...