AOJ 0118 Property Distribution
题目链接:
https://vjudge.net/problem/Aizu-0118#author=0
这题没什么难的,就是有一个技巧:
在处理连通分量的外层循环的时候:
遍历把他变成一个个位置(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;
}