uva 10315 Poker Hands

一道比较消磨时间的简单题目。

#include <stdio.h>
#include <algorithm>

struct node
{
	int num;
	char color;
};

struct node b[5];
struct node w[5];

int cmp(const void *a, const void *b)
{
	struct node *pa = (struct node*)a;
	struct node *pb = (struct node*)b;

	return pa->num	- pb->num;
}


int get_type(struct node *p)
{
	bool shunzi;
	bool tonghua;

	shunzi = tonghua = false;

	if
	(
		p[1].num-p[0].num == 1 &&
		p[2].num-p[1].num == 1 &&
		p[3].num-p[2].num == 1 &&
		p[4].num-p[3].num == 1
	)
	{
		shunzi = true;
	}

	if
	(
		p[0].color == p[1].color &&
		p[1].color == p[2].color &&
		p[2].color == p[3].color &&
		p[3].color == p[4].color
	)
	{
		tonghua = true;
	}

	if(shunzi && tonghua)
		return 8;
	else if(shunzi)
		return 4;
	else if(tonghua)
		return 5;

	if
	(
		p[0].num == p[1].num &&
		p[1].num == p[2].num &&
		p[2].num == p[3].num 
		||
		p[1].num == p[2].num &&
		p[2].num == p[3].num &&
		p[3].num == p[4].num 
	)
		return 7;

	if
	(
		p[0].num == p[1].num &&
		p[1].num == p[2].num &&
		p[3].num == p[4].num
		||
		p[0].num == p[1].num &&
		p[2].num == p[3].num &&
		p[3].num == p[4].num
	)
	return 6;

	if
	(
		p[0].num == p[1].num &&
		p[1].num == p[2].num  
		||
		p[1].num == p[2].num &&
		p[2].num == p[3].num 
		||
		p[2].num == p[3].num &&
		p[3].num == p[4].num 
	)
	return 3;

	if
	(
		p[0].num == p[1].num &&
		p[2].num == p[3].num
		||
		p[0].num == p[1].num &&
		p[3].num == p[4].num
		||
		p[1].num == p[2].num &&
		p[3].num == p[4].num
	)
	return 2;

	if
	(
		p[0].num == p[1].num ||
		p[1].num == p[2].num ||
		p[2].num == p[3].num ||
		p[3].num == p[4].num
	)
	return 1;

	return 0;
}

void func()
{
	int type_w, type_b;
	int value_w, value_b;
	int temp_w[5], temp_b[5];
	int win = 0; //1---black win 0--tie -1---white win     
	int i, j;
	int pair_w, big_pair_w, small_pair_w;
	int pair_b, big_pair_b, small_pair_b;


	qsort(b, 5, sizeof(struct node), cmp);
	qsort(w, 5, sizeof(struct node), cmp);

	type_w = get_type(w);
	type_b = get_type(b);

	//printf("type_w=%d type_b=%d\n", type_w, type_b);	

	if(type_w > type_b)
	{
		win = -1;
		goto last;
	}
	else if(type_w < type_b)
	{
		win = 1;
		goto last;
	}
	else
	{
		switch(type_w)
		{
		case 0:
		case 5:
			//printf("w:%d %d %d %d %d\n", w[0].num, w[1].num, w[2].num, w[3].num, w[4].num);
			//printf("b:%d %d %d %d %d\n", b[0].num, b[1].num, b[2].num, b[3].num, b[4].num);
			value_w = w[0].num+w[1].num*15+w[2].num*15*15+w[3].num*15*15*15+w[4].num*15*15*15*15;
			value_b = b[0].num+b[1].num*15+b[2].num*15*15+b[3].num*15*15*15+b[4].num*15*15*15*15;
			if(value_b > value_w)
			{
				win = 1;
				goto last;
			}
			else if(value_b < value_w)
			{
				win = -1;
				goto last;
			}
			else
			{
				win = 0;
				goto last;
			}
			break;
		case 1:
			for(i=0; i<=4; i++)
				if(w[i].num == w[i+1].num)
				{
					pair_w = w[i].num;
					w[i].num = w[i+1].num = 0;
				}
			

			for(i=0; i<=4; i++)
				if(b[i].num == b[i+1].num)
				{
					pair_b = b[i].num;
					b[i].num = b[i+1].num = 0;
				}

			if(pair_b > pair_w)
			{
				win = 1;
				goto last;
			}
			else if(pair_b < pair_w)
			{
				win = -1;
				goto last;
			}
			
			qsort(w, 5, sizeof(struct node), cmp);
			qsort(b, 5, sizeof(struct node), cmp);

			value_w = w[2].num+w[3].num*15+w[4].num*15*15;
			value_b = b[2].num+b[3].num*15+b[4].num*15*15;

			if(value_b > value_w)
			{
				win = 1;
				goto last;
			}
			else if(value_b < value_w)
			{
				win = -1;
				goto last;
			}
			else
			{
				win = 0;
				goto last;
			}
			break;
		case 2:
			big_pair_b = big_pair_w = small_pair_b = small_pair_w = 0;
			for(i=0; i<=4; i++)
				if(w[i].num == w[i+1].num)
				{
					if(small_pair_w == 0)
						small_pair_w = w[i].num;
					else
						big_pair_w = w[i].num;
					w[i].num = w[i+1].num = 0;
				}

			for(i=0; i<=4; i++)
				if(b[i].num == b[i+1].num)
				{
					if(small_pair_b == 0)
						small_pair_b = b[i].num;
					else
						big_pair_b = b[i].num;
					b[i].num = b[i+1].num = 0;
				}

			if(big_pair_b > big_pair_w)
			{
				win = 1;
				goto last;
			}
			else if(big_pair_b < big_pair_w)
			{
				win = -1;
				goto last;
			}
			
			if(small_pair_b > small_pair_w)
			{
				win = 1;
				goto last;
			}
			else if(small_pair_b < small_pair_w)
			{
				win = -1;
				goto last;
			}

			qsort(w, 5, sizeof(struct node), cmp);
			qsort(b, 5, sizeof(struct node), cmp);

			value_w = w[4].num;
			value_b = b[4].num;

			if(value_b > value_w)
			{
				win = 1;
				goto last;
			}
			else if(value_b < value_w)
			{
				win = -1;
				goto last;
			}
			else
			{
				win = 0;
				goto last;
			}
			break;
		case 3:
		case 6:
		case 7:
			value_w = w[2].num;
			value_b = b[2].num;

			if(value_b > value_w)
			{
				win = 1;
				goto last;
			}
			else if(value_b < value_w)
			{
				win = -1;
				goto last;
			}
			else
			{
				win = 0;
				goto last;
			}
			break;
		case 4:
		case 8:
			value_w = w[4].num;
			value_b = b[4].num;

			if(value_b > value_w)
			{
				win = 1;
				goto last;
			}
			else if(value_b < value_w)
			{
				win = -1;
				goto last;
			}
			else
			{
				win = 0;
				goto last;
			}
			break;
		}
	}

last:
	if(1 == win)
		printf("Black wins.\n");
	else if(-1 == win)
		printf("White wins.\n");
	else
		printf("Tie.\n");
}


int main(void)
{
	int r;
	int i;
	char buffer[10];
	int num;
	char color;

	while(1)
	{
		for(i=0; i<=9; i++)
		{
			r = scanf("%s", buffer);
			if(r == EOF)
				goto end;

			switch(buffer[0])
			{
			case '2':
				num = 2;
				break;
			case '3':
				num = 3;
				break;
			case '4':
				num = 4;
				break;
			case '5':
				num = 5;
				break;
			case '6':
				num = 6;
				break;
			case '7':
				num = 7;
				break;
			case '8':
				num = 8;
				break;
			case '9':
				num = 9;
				break;
			case 'T':
				num = 10;
				break;
			case 'J':
				num = 11;
				break;
			case 'Q':
				num = 12;
				break;
			case 'K':
				num = 13;
				break;
			case 'A':
				num = 14;
				break;
			}

			color = buffer[1];
			
			if(i<=4)
			{
				b[i].num = num;
				b[i].color = color;
			}
			else
			{
				w[i-5].num = num;
				w[i-5].color = color;
			}
		}
		//printf("w:%d %d %d %d %d\n", w[0].num, w[1].num, w[2].num, w[3].num, w[4].num);
		//printf("b:%d %d %d %d %d\n", b[0].num, b[1].num, b[2].num, b[3].num, b[4].num);
		func();
	}

end:
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值