题目:给你一个地图,分成很多个区域'*',每个区域中还有一些'X',求每个区域中'X'区域的个数。
分析:搜索,bfs+dfs。
首先,利用bfs寻找每个'*'的区域;
然后,在每个区域中,遇到'X'用floodfill处理,将'X'统计,并转化成'*';
最后,统计输出即可。
说明:区域的边界不一定只有'*',也可能是'X';每组数据后有一个空行。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef struct nodeq
{
int x,y;
}queue;
queue Q[2500],Now,New;
int ans[2500];
char maps[51][51];
int dxy[4][2] = {1,0,0,1,-1,0,0,-1};
void dfs( int x, int y, int n, int m )
{
if ( x < 0 || y < 0 || x >= n || y >= m || maps[x][y] != 'X' )
return;
maps[x][y] = '*';
for ( int i = 0 ; i < 4 ; ++ i )
dfs( x+dxy[i][0], y+dxy[i][1], n, m );
}
int bfs( int x, int y, int n, int m )
{
int count = 0;
if ( maps[x][y] == 'X' ) {
dfs( x, y, n, m );
count ++;
}
int move = 0,save = 1;
Q[0].x = x;Q[0].y = y;
while ( move < save ) {
Now = Q[move ++];
for ( int i = 0 ; i < 4 ; ++ i ) {
New.x = Now.x + dxy[i][0];
New.y = Now.y + dxy[i][1];
if ( New.x >= 0 && New.x < n && New.y >= 0 && New.y < m ) {
if ( maps[New.x][New.y] == 'X' ) {
dfs( New.x, New.y, n, m );
count ++;
}
if ( maps[New.x][New.y] == '*' ) {
maps[New.x][New.y] = '.';
Q[save ++] = New;
}
}
}
}
return count;
}
int main()
{
int n,m,T = 1;
while ( ~scanf("%d%d",&m,&n) && n+m ) {
for ( int i = 0 ; i < n ; ++ i )
scanf("%s",maps[i]);
int count = 0;
for ( int i = 0 ; i < n ; ++ i )
for ( int j = 0 ; j < m ; ++ j )
if ( maps[i][j] == '*' || maps[i][j] == 'X' )
ans[count ++] = bfs( i, j, n, m );
sort( ans, ans+count );
printf("Throw %d\n%d",T ++,ans[0]);
for ( int i = 1 ; i < count ; ++ i )
printf(" %d",ans[i]);
printf("\n\n");
}
return 0;
}