zoukankan      html  css  js  c++  java
  • hdu 1198

    一看到这一题,我真没想到用并查集做,坑啊,看看别人的大致思路才知道用并查集可以做,唉,看来是自己太弱了~~~

    View Code
     1 #include <cstdio>
    2 #include <cstring>
    3
    4 int pipe[11][4]={{1,0,0,1},{1,1,0,0},{0,0,1,1},
    5 {0,1,1,0},{1,0,1,0},{0,1,0,1},{1,1,0,1},{1,0,1,1},
    6 {0,1,1,1},{1,1,1,0},{1,1,1,1}};//将每个都编号了,并且用上了边
    7 int f[3000];
    8 int map[3000];
    9
    10 int find(int x)
    11 {
    12 if(x == f[x])
    13 return x;
    14 int t = find(f[x]);
    15 f[x] = t;
    16 return t;
    17 }
    18
    19 void join(int x,int y)
    20 {
    21 int fx = find(x);
    22 int fy = find(y);
    23 if(fx != fy)
    24 f[fx] = fy;
    25 }
    26
    27 int main()
    28 {
    29 int n,m;
    30 while(scanf("%d%d",&n,&m) == 2)
    31 {
    32 if(n < 0||m < 0)
    33 break;
    34 char ch;
    35 getchar();
    36 int i,j;
    37 int k = 0,num;
    38 for(i = 0;i < n;i ++)
    39 {
    40 for(j = 0;j < m;j ++)
    41 {
    42 scanf("%c",&ch);
    43 num = ch - 'A';
    44 map[k ++] = num;//将字母数字化,并按顺序记录
    45 }
    46 getchar();
    47 }
    48
    49 for(i = 0;i < k;i ++)
    50 {
    51 f[i] = i;
    52 }
    53
    54 int ins;
    55 for(i = 0;i < k;i ++)
    56 {
    57 int row = i / m;//将数字化的结果还得转化为行列,这样方便判断它上下左右
    58 int col = i - row * m;
    59
    60 if(row-1 >= 0)
    61 {
    62 ins = i - m;
    63 if(pipe[map[ins]][2]&&pipe[map[i]][0])
    64 join(ins,i);
    65 }
    66 if(col + 1 < m)
    67 {
    68 ins = i + 1;
    69 if(pipe[map[ins]][3]&&pipe[map[i]][1])
    70 join(ins,i);
    71 }
    72 if(row + 1 < n)
    73 {
    74 ins = i + m;
    75 if(pipe[map[ins]][0]&&pipe[map[i]][2])
    76 join(ins,i);
    77 }
    78 if(col - 1 >= 0)
    79 {
    80 ins = i - 1;
    81 if(pipe[map[ins]][1]&&pipe[map[i]][3])
    82 join(ins,i);
    83 }
    84 }
    85 int ans = 0;
    86 for(i = 0;i < k;i ++)
    87 {
    88 if(f[i] == i)
    89 ans ++;
    90 }
    91 printf("%d\n",ans);
    92 }
    93 return 0;
    94 }
  • 相关阅读:
    C 习题
    gcc
    几何视角看线性方程组解的情况
    JAVA设计模式之工厂模式(简单工厂模式+工厂方法模式)
    为什么重写了equals(),还要重写hashCode()?
    关于ArrayList的越界问题?
    通过实例聊聊Java中的多态
    java异常处理实例分析
    Java: Integer用==比较时127相等128不相等的原因
    Java并发编程:Lock
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2388498.html
Copyright © 2011-2022 走看看