对于一般块块里有块块的用双重搜索 长姿势 啊
#include <iostream>
#include <stdio.h>#include <stdlib.h>
#include <string.h>
#include <algorithm>
using namespace std;
char dif[66][66];
int clo, row;
int move[4][2] = { {0, 1}, { 0, -1}, { 1, 0}, { -1, 0} };
int num[10000];
int cnt = 0;
void dfs1(int x, int y)
{
dif[x][y] = '*';
for( int i = 0; i < 4; i++)
{
int tempx = x + move[i][0];
int tempy = y + move[i][1];
if(tempx < 0 || tempy < 0 || tempx >= row || tempy >= clo || dif[tempx][tempy] == '*')
continue;
if(dif[tempx][tempy] == 'X')
dfs1(tempx, tempy);
}
}
void dfs2(int x, int y )
{
dif[x][y] = '.';
for( int i = 0; i < 4; i++)
{
int tempx = x + move[i][0];
int tempy = y + move[i][1];
if(tempx < 0 || tempy < 0 || tempx >= row || tempy >= clo || dif[tempx][tempy] == '.')
continue;
if(dif[tempx][tempy] == 'X')
{
dfs1(tempx, tempy);
num[cnt]++;
}
if(dif[tempx][tempy] == '*')
dfs2(tempx, tempy);
}
}
int main()
{
int cases = 1;
while(scanf("%d%d",&clo, &row) != EOF && row && clo )
{
cnt = 0;
getchar();
memset(dif,'.', sizeof(dif));
memset(num, 0, sizeof(num));
for( int i = 0; i < row; i++)
gets(dif[i]);
for( int i = 0; i < row; i++)
{
for( int j = 0; j < clo; j++)
{
if(dif[i][j] == '*')
{
dfs2(i,j);
cnt++;
}
}
}
sort(num, num + cnt);
printf("Throw %d\n",cases++);
printf("%d",num[0]);
for( int i = 1; i < cnt; i++ )
printf(" %d",num[i]);
printf("\n\n");
}
return 0;
}