题目地址:点击打开链接
遍历两次就可以了
C++代码:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxsize = 60;
string s[maxsize];
int visited[maxsize][maxsize];
int w,h;
int num[maxsize][maxsize];
int height;
const int maxcount = 3000;
int vi[maxcount];
void dfs_num(int i,int j)
{
if(i>=0&&i<w&&j>=0&&j<h&&!visited[i][j]&&s[i][j]!='.')
{
visited[i][j]=1;
num[i][j]=height;
dfs_num(i-1,j);
dfs_num(i+1,j);
dfs_num(i,j-1);
dfs_num(i,j+1);
}
}
void dfs(int i ,int j)
{
if(i>=0&&i<w&&j>=0&&j<h&&!visited[i][j]&&s[i][j]=='X')
{
visited[i][j]=1;
dfs(i-1,j);
dfs(i+1,j);
dfs(i,j-1);
dfs(i,j+1);
}
}
int main()
{
int cas=1;
while(cin>>h>>w)
{
if(w==0&&h==0)
break;
int i,j;
for(i=0;i<w;++i)
cin>>s[i];
memset(visited,0,sizeof(visited));
memset(num,0,sizeof(num));
height=0;
for(i=0;i<w;++i)
{
for(j=0;j<h;++j)
{
if(!visited[i][j]&&s[i][j]!='.')
{
dfs_num(i,j);
++height;
}
}
}
memset(vi,0,sizeof(vi));
memset(visited,0,sizeof(visited));
for(i=0;i<w;++i)
{
for(j=0;j<h;++j)
{
if(!visited[i][j]&&s[i][j]=='X')
{
dfs(i,j);
++vi[num[i][j]];
}
}
}
sort(vi,vi+height);
if(height!=0)
{
cout<<"Throw "<<cas++<<endl;
for(i=0;i<height-1;++i)
cout<<vi[i]<<" ";
cout<<vi[i]<<endl<<endl;
}
else
cout<<0<<endl<<endl;
}
return 0;
}