1. 程式人生 > >搜索練習3

搜索練習3

練習 cst ide 不同的 pop close truct adg 超過

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