657UVa掷骰子(图)

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);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值