题目大致是说要你在一个大图里搜四连块(每个四连块表示一个色子面)的个数,在每个四连块里搜色子的点数,点数只能是1到6之间的数.......
30 15 .............................. .............................. ...............*.............. ...*****......****............ ...*X***.....**X***........... ...*****....***X**............ ...***X*.....****............. ...*****.......*.............. .............................. ........***........******..... .......**X****.....*X**X*..... ......*******......******..... .....****X**.......*X**X*..... ........***........******..... .............................. 0 0
Sample Output
Throw 1 1 2 2 4
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include <algorithm>
#define M 251
#define N 55
char ma[N][N];
int v[N][N];
int a[N],top;
int dx[4]= {-1,0,1,0};
int dy[4]= {0,1,0,-1};
using namespace std;
void dfs(int x,int y)
{
int xx,yy;
v[x][y]=top;
for(int i=0; i<4; i++)
{
xx=x+dx[i],yy=y+dy[i];
if((ma[xx][yy]=='*'||ma[xx][yy]=='X')&&(v[xx][yy]==0))
dfs(xx,yy);
}
}
void dfs1(int x,int y)
{
int xx,yy;
ma[x][y]='*';
for(int i=0; i<4; i++)
{
xx=x+dx[i],yy=y+dy[i];
if(ma[xx][yy]=='X')
dfs1(xx,yy);
}
}
int cmp(const void *a,const void *b)
{
return (*(int *)a)-(*(int *)b);
}
int main()
{
// freopen("ex.in","r",stdin);
int h,w,ncase=0;
while(scanf("%d%d%*c",&w,&h)&&(h!=0||w!=0))
{
top=0;
memset(v,0,sizeof(v));
memset(a,0,sizeof(a));
memset(ma,0,sizeof(ma));
for (int i=1; i<=h ; i++ )
{
for (int j=1; j<=w ; j++)
{
scanf("%c",&ma[i][j]);
}
scanf("%*c");
}
for (int i=1; i<=h ; i++ )
{
for (int j=1; j<=w ; j++)
{
if((ma[i][j]=='*'||ma[i][j]=='X')&&(v[i][j]==0))
{
top++;
dfs(i,j);
}
}
}
for (int i=1; i<=h ; i++ )
{
for (int j=1; j<=w ; j++)
{
if(ma[i][j]=='X')
{
a[v[i][j]]++;
dfs1(i,j);
}
}
}
qsort(a+1,top,sizeof(a[0]),cmp);
printf("Throw %d\n",++ncase);
printf("%d",a[1]);
for(int i=2; i<=top; i++)
printf(" %d",a[i]);
puts("\n");
}
return 0;
}