AOJ 0118 Property Distribution

题目链接:

https://vjudge.net/problem/Aizu-0118#author=0

这题没什么难的,就是有一个技巧:

在处理连通分量的外层循环的时候:

AOJ 0118 Property Distribution

遍历把他变成一个个位置(0---H*W-1),像八皇后一样。

 

代码:

//AOJ0118
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
#define MAXN 110

int Map[MAXN][MAXN];//苹果是1,雪梨是2,蜜柑是3---(@,#,*)
bool vis[MAXN][MAXN];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int H,W;

bool Judge(int x,int y,int kind)
{
    bool flag=false;
    if(x>=0&&x<H&&y>=0&&y<W)
        if(!vis[x][y]&&Map[x][y]==kind)
            flag=true;
    return flag;
}

void dfs(int x,int y)
{
    int i;
    int tx,ty;
    int kind;

    kind=Map[x][y];
    for(i=0;i<4;i++)
    {
        tx=x+dx[i];
        ty=y+dy[i];
        if(Judge(tx,ty,kind))
        {
            vis[tx][ty]=true;
            dfs(tx,ty);
        }
    }
}

int main()
{
    int i,j;
    int ans;
    char ch;
    int x,y;

    while(scanf("%d%d",&H,&W)&&(H+W))
    {
        memset(Map,0,sizeof(Map));
        for(i=0;i<H;i++)
        {
            for(j=0;j<W;j++)
            {
                cin>>ch;
                if(ch=='@')
                    Map[i][j]=1;
                else if(ch=='#')
                    Map[i][j]=2;
                else
                    Map[i][j]=3;
            }
        }
        ans=0;
        memset(vis,0,sizeof(vis));
        for(i=0;i<H*W;i++)
        {
            x=i/W;
            y=i%W;
            if(!vis[x][y])
            {
                ans++;
                dfs(x,y);
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}