码迷,mamicode.com
首页 > 其他好文 > 详细

搜索练习3

时间:2017-11-19 18:48:34      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:enc   close   换行   gif   include   代码   class   oid   ==   

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)

 

 

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

 

搜索练习3

标签:enc   close   换行   gif   include   代码   class   oid   ==   

原文地址:http://www.cnblogs.com/wsdestdq/p/7860544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!