zoukankan      html  css  js  c++  java
  • Farm Irrigation HDU

    Farm Irrigation

    HDU - 1198

    题意:给11种管道,问草地最少需要打多少个井才可以全部灌溉。

    把每种管道的状态用二进制表示一下,然后对每一块草地,判断能否和上面或者左面的草地的管道连接。

    然后并查集搞一下。

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 const int maxn=55;
     4 
     5 int g[12]={10,9,6,5,12,3,11,14,7,13,15};
     6 int f[maxn*maxn];
     7 char p[maxn][maxn];
     8 int n,m;
     9 
    10 int gf(int x){
    11     return x==f[x]?f[x]:f[x]=gf(f[x]);
    12 }
    13 void uni(int a,int b){
    14     int pa=gf(a),pb=gf(b);
    15     f[pa]=pb;
    16 }
    17 void check(int i,int j){
    18     int id=i*m+j;
    19     if(i>0&&((g[p[i][j]-'A']>>3)&1)&&((g[p[i-1][j]-'A']>>2)&1)) {
    20         uni(id,id-m);
    21     }
    22     if(j>0&&((g[p[i][j]-'A']>>1)&1)&&((g[p[i][j-1]-'A'])&1)) {
    23         uni(id,id-1);
    24     }
    25     return ;
    26 }
    27 
    28 int main(){
    29    // freopen("in.txt","r",stdin);
    30     while(scanf("%d%d",&n,&m)&&(n!=-1&&m!=-1)){
    31         for(int i=0;i<n;i++){
    32             scanf("%s",p[i]);
    33             for(int j=0;j<m;j++){
    34                 int id=i*m+j;
    35                 f[id]=id;
    36             }
    37         }
    38         for(int i=0;i<n;i++){
    39             for(int j=0;j<m;j++){
    40                 check(i,j);
    41             }
    42         }
    43         n=n*m;
    44         int cnt=0;
    45         for(int i=0;i<n;i++) if(gf(i)==i) cnt++;
    46         printf("%d
    ",cnt);
    47     }
    48     return 0;
    49 }
    View Code
  • 相关阅读:
    SRM 588 D2 L3:GameInDarknessDiv2,DFS
    [置顶] ProDinner体验
    [置顶] 强制访问控制内核模块Smack
    Java小项目--坦克大战(version1.0)
    utf-8-validation
    is-subsequence
    perfect-rectangle
    find-the-difference
    longest-absolute-file-path
    first-unique-character-in-a-string
  • 原文地址:https://www.cnblogs.com/yijiull/p/7487601.html
Copyright © 2011-2022 走看看