zoukankan      html  css  js  c++  java
  • 搜索练习3

    P1767 家族_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个字符。

    _NOI导刊2010普及(10)

    Solution:

      每次做字符串的问题一定会被输入坑,cin忽略空格。。。 gets会读入换行符。。。。

      还有这个题目本身的搜索是最基本的搜索,然而我却在输入处理上被坑了好久。。。。(代码注释部分为什么错了?)

      对于搜索的边界仔细考虑。。

    Code:

    #include<queue>
    #include<cstdio>
    #include<cstring>
    #include<iostream>
    using namespace std;
    
    int n,map[110][233],mxn,vis[110][233],ans;
    char ch[110][233];
    int dx[4]= {0,0,1,-1},
               dy[4]= {1,-1,0,0}; //东西南北
    struct Node {
        int x,y;
    } now,nxt;
    queue<Node>q;
    
    void bfs(int x,int y) {
        now.x = x, now.y = y;
        q.push(now);
        vis[now.x][now.y]=1;
        while(!q.empty()) {
            now=q.front();
            q.pop();
            for(int i=0; i<4; i++) {
                nxt.x=now.x+dx[i], nxt.y=now.y+dy[i];
                if(nxt.x<=0 || nxt.x>n || nxt.y<=0 || nxt.y>mxn) continue;
                if(!vis[nxt.x][nxt.y] && map[nxt.x][nxt.y]) {
                    q.push(nxt);
                    vis[nxt.x][nxt.y]=1;
                }
            }
        }
    }
    
    int main() {
        scanf("%d",&n);
        for(int i=0; i<=n; i++) {
            gets(ch[i]);
            if(i==0) continue;
            int lenc=strlen(ch[i]);
            for(int j=0; j<lenc; j++) {
    //            if(ch[i][j]=='*' || ch[i][j]==' ') map[i][j+1]=0;
    //            else map[i][j+1]=1;
                if('a'<=ch[i][j] && ch[i][j]<='z')
                    map[i][j+1]=1;
            }
            mxn=max(mxn,lenc);
        }
        for(int i=1; i<=n; i++)
            for(int j=1; j<=mxn; j++)
                if(map[i][j] && !vis[i][j]) {
                    bfs(i,j);
                    ans++;
                }
        printf("%d",ans);
        return 0;
    }
    AC(注释代码50)

    自己选的路,跪着也要走完!!!

  • 相关阅读:
    SQLServer2008 行转列2
    SQLServer2008 行转列
    关于删除数据仓库的数据
    PowerDesign不让name和code联动
    提高SQL查询效率(SQL优化)(转载)
    SQL优化----百万数据查询优化(转载)
    运行程序向一个Java类中动态添加注解。
    开阔自己的视野,勇敢的接触新知识(转)
    [置顶] JAVA识别身份证号码,H5识别身份证号码,tesseract-ocr识别(一)(转)
    一个谷歌程序员的算法学习之路
  • 原文地址:https://www.cnblogs.com/wsdestdq/p/7860544.html
Copyright © 2011-2022 走看看