博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bzoj3041 水叮当的舞步
阅读量:6825 次
发布时间:2019-06-26

本文共 2463 字,大约阅读时间需要 8 分钟。

 

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 132  Solved: 75

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

HINT

 

Source

 

DFS+IDA星

网络流写累了换换口味

其实就是Flood it : http://www.cnblogs.com/SilverNebula/p/5858410.html

 

1 /*by SilverN*/ 2 #include
3 #include
4 #include
5 #include
6 #include
7 #include
8 using namespace std; 9 const int mx[5]={ 0,1,0,-1,0};10 const int my[5]={ 0,0,1,0,-1};11 const int mxn=10;12 int read(){13 int x=0,f=1;char ch=getchar();14 while(ch<'0' || ch>'9'){ if(ch=='-')f=-1;ch=getchar();}15 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}16 return x*f;17 }18 int n,ans;19 int mp[mxn][mxn];20 int vis[mxn];21 int mark[mxn][mxn];22 int get(){ //估价 23 int cnt=0;24 memset(vis,0,sizeof vis);25 for(int i=1;i<=n;i++){26 for(int j=1;j<=n;j++){27 if(!vis[mp[i][j]] && mark[i][j]!=1){28 vis[mp[i][j]]=1;29 cnt++;30 }31 }32 }33 return cnt;34 }35 void fill(int x,int y,int co){36 mark[x][y]=1;37 for(int i=1;i<=4;i++){38 int nx=x+mx[i];39 int ny=y+my[i];40 if(nx<1 || nx>n || ny<1 ||ny>n || mark[nx][ny]==1)continue;41 mark[nx][ny]=2;42 if(mp[nx][ny]==co)fill(nx,ny,co);43 }44 return;45 }46 int change(int co){47 bool cnt=0;48 for(int i=1;i<=n;i++)49 for(int j=1;j<=n;j++){50 if(mark[i][j]==2 && mp[i][j]==co){51 fill(i,j,co);52 cnt=1;53 }54 }55 return cnt;56 }57 void DFS(int res,int lim){58 int tmp=get();59 if(!tmp){ans=res;return;}60 if(res+tmp>lim)return;61 if(ans<1000)return;62 int cpy[mxn][mxn];63 for(int i=0;i<=5;i++){64 memcpy(cpy,mark,sizeof mark);65 if(change(i))DFS(res+1,lim);66 memcpy(mark,cpy,sizeof cpy);67 }68 return;69 }70 int main(){71 int i,j;72 while(scanf("%d",&n) && n){73 memset(mark,0,sizeof mark);74 ans=1000;75 for(i=1;i<=n;i++)76 for(j=1;j<=n;j++)77 mp[i][j]=read();78 fill(1,1,mp[1][1]);79 for(i=1;i;i++){80 DFS(0,i);81 if(ans<1000){82 printf("%d\n",ans);83 break;84 }85 }86 }87 return 0;88 }

 

转载于:https://www.cnblogs.com/SilverNebula/p/6249754.html

你可能感兴趣的文章
PHP中常用的输出语句比较?
查看>>
android&nbsp;setBackgroundColor
查看>>
UVa11181 条件概率
查看>>
<Linux> xm 命令
查看>>
linux 常用命令
查看>>
ecna 2017 J Workout for a Dumbbell (模拟)
查看>>
用Quick3.3开发微信打飞机 (二) -------------------- 子弹和敌人的配置和创建
查看>>
Tui-x 自适应屏幕 (转) ----- 6
查看>>
解题思路
查看>>
AngularJS - Apply方法监听model变化
查看>>
silverlight 添加配置项
查看>>
Linux之 VIM 编辑器
查看>>
实用网址集合
查看>>
【转】移动web资源整理
查看>>
【Linux】CentOS7下安装JDK详细过程
查看>>
(转)Hibernate 的应用(Hibernate 的结构)?
查看>>
Ubuntu terminator 多窗口终端的快捷键
查看>>
Add Binary leetcode
查看>>
关于pycharm中缩进、粘贴复制等文本编辑功能部分失效的解决办法
查看>>
[20190524]浅谈模糊查询.txt
查看>>