• 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 }
  • 相关阅读:
    spark on yarn 无法提交任务问题
    git rebase 操作撤销
    vim 删除屏蔽行
    mysql 登录远程数据库 失败
    springboot拦截器中获取配置文件值
    根据经纬度获取地址 :位置名称 区 市 省 国家 邮编
    element-ui upload组件上传
    java读写excel文件( POI解析Excel)
    easyui+themeleaf 分页查询实现
    java生成二维码
  • 原文地址:https://www.cnblogs.com/SilverNebula/p/6249754.html
Copyright © 2020-2023  润新知