AOJ 0118 Property Distribution (BFS)

来源:互联网 发布:工商银行数据中心待遇 编辑:程序博客网 时间:2024/05/16 02:12

高端大气的日本OJ链接:点击打开链接

第一次做日文ACM题。。。虽然很水,但是我也想水一篇博客来纪念一下哈哈~~~~~


题意:

在H * W的矩形果园里有苹果、梨、蜜柑三种果树, 相邻(上下左右)的同种果树属于同一个区域,给出果园的果树分布,求总共有多少个区域。 (原题的样图中苹果为リ,梨为カ,蜜柑为ミ, 图中共10个区域) 

输入:

多组数据,每组数据第一行为两个整数H,W(H <= 100, W <= 100), H =0 且 W = 0代表输入结束。以下H行W列表示果园的果树分布, 苹果是@,梨是#, 蜜柑是*。 

输出:

对于每组数据,输出其区域的个数。


分析:

就是以每个点为起点BFS找相邻的和它相同水果且未标记的点,然后标记就可以了。

再就计数。


#include<cstdio>#include<queue>#include<cstring>using namespace std;char gy[110][110];int dx[]={-1,1,0,0};int dy[]={0,0,-1,1};int vis[110][110];int h,w;struct node{    int x,y;}a;bool ok(int x,int y){    if(x>=0 && x<h && y>=0 && y<w)        return true;    return false;}void bfs(int x,int y,char c){    a.x = x;    a.y = y;    queue<node> q;    q.push(a);    node cur,next;    while(!q.empty())    {        cur = q.front();        q.pop();        for(int i=0;i<4;i++)        {            next.x = cur.x+dx[i];            next.y = cur.y+dy[i];            if(ok(next.x,next.y) && !vis[next.x][next.y] && gy[next.x][next.y]== gy[cur.x][cur.y])            {                vis[next.x][next.y]=true;                q.push(next);            }        }    }}int solve(){    int cnt=0;    for(int i=0;i<h;i++)    {        for(int j=0;j<w;j++)        {            if(!vis[i][j])            {                bfs(i,j,gy[i][j]);                cnt++;            }        }    }    printf("%d\n",cnt);}int main(){    while(scanf("%d%d",&h,&w)!=EOF)    {        if(h==0 && w==0)            break;        memset(gy,0,sizeof(gy));        memset(vis,0,sizeof(vis));        for(int i=0;i<h;i++)            scanf("%s",gy[i]);        solve();    }    return 0;}


dfs也可以哦~~~~

http://blog.csdn.net/synapse7/article/details/14453017



0 0