#include <iostream>
#include <cstdio>
#include <fstream>
#include <cstring>
#include <stdlib.h>
#include <string.h>
#include <stack>
using namespace std;
int height,width;
char map[55][55];
int ans[1000];
int step_x[]={1,-1,0,0};
int step_y[]={0,0,1,-1};
struct pointT{
int x,y;
};
int cmp(const void *a,const void *b){
int *p1 = (int *)a;int *p2=(int *)b;
if(*p1>*p2){return 1;}
else{return -1;}
}
void bfs(){
memset(ans,0,sizeof(ans));
int cnt=0,newx,newy;
stack<pointT>sta;
stack<pointT>sta_x;
pointT temp,fuc,zigzag;
for(int i=0;i<height;i++)
{
for(int j=0;j<width;j++)
{
if(map[i][j]=='*')
{
cnt++;
temp.x=i;temp.y=j;
sta.push(temp);
while(!sta.empty())
{
temp = sta.top();
sta.pop();
if(map[temp.x][temp.y]=='X')
{
ans[cnt]++;
sta_x.push(temp);
while(!sta_x.empty())
{
fuc=sta_x.top();
sta_x.pop();
map[fuc.x][fuc.y]='.';
for(int z=0;z<4;z++)
{
newx=fuc.x+step_x[z];newy=fuc.y+step_y[z];
if(newx<0||newx>=height||newy<0||newy>=width){continue;}
if(map[newx][newy]=='X'){zigzag.x=newx;zigzag.y=newy;sta_x.push(zigzag);}
}
}
}
map[temp.x][temp.y]='.';
for(int z=0;z<4;z++)
{
newx=temp.x+step_x[z];newy=temp.y+step_y[z];
if(newx<0||newx>=height||newy<0||newy>=width){continue;}
if(map[newx][newy]=='*'||map[newx][newy]=='X'){fuc.x=newx;fuc.y=newy;sta.push(fuc);}
}
}
}
}
}
qsort(ans+1,cnt,sizeof(int),cmp);
for(int i=1;i<=cnt;i++){cout<<ans[i]<<" ";}
cout<<endl;
}
int main()
{
//ifstream cin("ha.txt");
int count=0;
while(cin>>width>>height&&width&&height)
{
count++;
for(int i=0;i<height;i++){
for(int j=0;j<width;j++)
{
cin>>map[i][j];
}
}
cout<<"Throw "<<count<<endl;
bfs();
cout<<endl;
}
}
poj 1481 图_广搜里面再广搜
最新推荐文章于 2024-08-29 11:50:21 发布