dfsdice():将每一片骰子(*和X)编号成1,2,3....(此时X对应的dice[i][j] !=0)
dfspot(): 访问没有访问过的X(访问过的X对应的dice[i][j]设为0),dice[i][j](对应的骰子)的点数加一。
#include<stdio.h>
#include<string.h>
char pic[60][60];
int dice[60][60];
int numdot[60];
void dfspot(int i,int j);
void dfsdice(int mark,int i,int j);
int main()
{
//
freopen("input.txt","r",stdin);
int w,h;
int throwd=1;
while(scanf("%d%d",&w,&h)==2)
{
if(!w&&!h) break;
memset(pic,0,sizeof(pic));
memset(dice,0,sizeof(dice));
memset(numdot,0,sizeof(numdot));
for(int i = 1;i <= h;i++)
{
scanf("%s",pic[i]+1);
}
int numdice = 1;
for(int i = 1;i <= h;i++)
{
for(int j = 1; j <= w;j++)
{
if((pic[i][j]=='*'||pic[i][j]=='X') && dice[i][j]==0)
dfsdice(numdice++,i,j);
}
}
numdice--;
for(int i = 1;i <= h;i++)
{
for(int j = 1; j <= w;j++)
{
if(pic[i][j]=='X'&&dice[i][j]) //is a pot, and this pot has't been visited
{
numdot[dice[i][j]]++;
dfspot(i,j);
}
}
}
for(int i = 2; i <= numdice;i++)
{
for(int j = i;j>1 && numdot[j-1] > numdot[j];j--)
{
int t = numdot[j-1];
numdot[j-1] = numdot[j];
numdot[j] = t;
}
}
printf("Throw %d\n",throwd++);
printf("%d",numdot[1]);
for(int i =2; i <= numdice;i++)
printf(" %d",numdot[i]);
putchar('\n');
putchar('\n');
}
}
void dfsdice(int mark,int i,int j)
{
if(!(pic[i][j]=='*'||pic[i][j]=='X') || dice[i][j])
return;
dice[i][j] = mark;
dfsdice(mark,i-1,j);
dfsdice(mark,i,j-1);
dfsdice(mark,i,j+1);
dfsdice(mark,i+1,j);
}
void dfspot(int i,int j)
{
if(dice[i][j]==0||pic[i][j]!='X')
return;
dice[i][j]=0;
dfspot(i-1,j);
dfspot(i+1,j);
dfspot(i,j-1);
dfspot(i,j+1);
}