• 家族_NOI导刊2010普及(10)


    题目描述

    在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝,但同一个家族的人不一定有相同姓氏。现在给你岛上的地图,求出岛上有多少个不同的家族。岛上的地图有n行,每行有若干列,每个格子中要么是“ ”,表示大海,要么是“*”,表示河流或山丘,要么是小写字母,表示一户人家的姓氏。

    输入输出格式

    输入格式:

    第一行是个数字N,表示下面信息的行数。接下来是N行字符,每行由小写字母和*号组成,有些行的最前面也可能包含若干连续的空格,表示这些区域是大海,每一行最多不超过200个字符。

    输出格式:

    一个数字,表示家族数。

    输入输出样例

    输入样例#1:
    4
    *zlw**pxh
    l*zlwk*hx*
    w*tyy**yyy
            zzl
    
    输出样例#1:
    3

    说明

    10%的数据,n≤1。 30%的数据,n≤10。 100%的数据,n≤100每一行最多不超过200个字符。

    關鍵是輸入,很惡心。。。

    代碼實現:

     1 #include<cstdio>
     2 int n,a,b=1,ans,l[200];
     3 char ch[300];
     4 bool map[200][300];
     5 void dfs(int x,int y){
     6     if(!map[x][y]) return;
     7     map[x][y]=0;
     8     dfs(x+1,y);dfs(x,y+1);
     9     dfs(x-1,y);dfs(x,y-1);
    10 }
    11 int main(){
    12     scanf("%d",&n);
    13     while(b<=n){
    14         a=1;ch[a]=getchar();
    15         while(ch[a]==' '||ch[a]=='*'||(ch[a]>='a'&&ch[a]<='z')){
    16             ++a;
    17             ch[a]=getchar();
    18         }
    19         if(a>1){
    20             for(int i=1;i<a;i++)
    21             if(ch[i]>='a'&&ch[i]<='z') map[b][i]=1;
    22             l[b]=a;b++;
    23         }
    24     }
    25     for(int i=1;i<=n;i++)
    26     for(int j=1;j<l[i];j++)
    27     if(map[i][j]){dfs(i,j);ans++;}
    28     printf("%d
    ",ans);
    29     return 0;
    30 }
    View Code

    想去犇站刷水題,結果卡在第一道上了。。。

  • 相关阅读:
    To do list
    2020 上半学期比赛记录
    板子
    Project Euler 1~10 野蛮题解
    卡常火车头
    防止unordered_map 被卡方法
    2019 香港区域赛 BDEG 题解
    2019徐州区域赛 ACEFM 题解 & pollard-rho & miller-rabin & 求出每个子树的重心 板子
    BST-splay板子
    ZJOI2017(2) 游记
  • 原文地址:https://www.cnblogs.com/J-william/p/6068070.html
Copyright © 2020-2023  润新知