• Bzoj3041 水叮当的舞步


    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<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<cstdio>
     6 #include<cmath>
     7 #include<vector>
     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
    ",ans);
    83                 break;
    84             }
    85         }
    86     }
    87     return 0;
    88 }
  • 相关阅读:
    PS转换图片——我教你
    通过Ajax——异步获取相关问题解答
    Spring的线程安全
    Spring MVC的工作机制
    Annotation的语法和使用
    Spring Bean的生命周期
    浅谈Spring
    Spring的事务管理
    行为型模式
    结构型模式
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6249754.html
Copyright © 2020-2023  润新知