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. php的ob_flush和flush(转)

    php.ini中 output_buffering = off 关闭php的缓存 implicit_flush = Off php不会立即输出到浏览器.如果是ON,相当于每次ECHO 立刻执行一个FL ...

  2. 精《记叙“tom”4年的软件开发之旅》

    1.引言 本篇文章是记叙tom四年的软件开发从业经历,虽然他资历不长,况且本身也是个菜鸟,但他也曾有过荣誉.迷茫.困惑与选择,在这里他希望通过自己所经历过的事情分享给大家,给那些真正热爱软件开发的同学 ...

  3. WebService学习笔记系列(一)

    webservice主要是解决两个系统或者两个应用程序之间的远程调用,它提供了一种通过web方式访问的api,调用是跨语言.跨平台的. webservice的客户端与服务端进行交互的时候使用xml来传 ...

  4. [学习笔记]设计模式之Bridge

    写在前面 为方便读者,本文已添加至索引: 设计模式 学习笔记索引 “魔镜啊魔镜,谁是这个世界上最美丽的人?”月光中,一个低沉的声音回荡在女王的卧室.“是美丽的白雪公主,她正和小霍比特人们幸福快乐地生活 ...

  5. FAQs: 我们可以在那里来为我的没有提升管理权限的应用程序存储用户数据?

    如果你正在写一个不需要管理员权限的应用程序,如写一个业务线应用(Line of Business,LOB),用户应用程序如游戏,你总是要把应用程序的数据写到一个标准用可以访问的目录.下面列出一些所推荐 ...

  6. angularjs 更新局部作用域

    前几天项目需要,做了一个背景遮罩的弹出框,html采用js动态添加进去的,结果发现angularjs绑定在这里面不起作用,搜索下解决了,记录下: var smallApplyParent = docu ...

  7. WCF学习笔记一(概述)

    WCF  Windows Communication Foundation 分布式通信框架.WCF是对现有分布式通信技术的整合.是各种分布式计算的集大成者.主要整合技术如下图: WCF的服务不能孤立的 ...

  8. 使用linq语句获取指定条数的记录

    //获得指定个数的子文件夹,用于分页 var pageAlbums = (from SPFolder pf in lstSubAlbums select pf)                     ...

  9. 如何改app图标名称

    InfoPlist.strings文件里写上:       CFBundleDisplayName="中文名字";

  10. GCDTimer

    #import <Foundation/Foundation.h> @interface JKTimerManager : NSObject + (instancetype)sharedT ...