现在的位置: 首页 > 综合 > 正文

[水题]ZOJ1111

2017年12月23日 ⁄ 综合 ⁄ 共 2874字 ⁄ 字号 评论关闭

ZOJ1111:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1011

关键是怎么对一手牌来进行评估,也没什么算法,主要就是复杂一点,用两个标志,一个是level,一个是level相等时要比较牌的大小,要从大到小来排。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;

#define pb push_back

int trans[256]={0,0};

struct card
{
	int num;
	char col;
	card(char n,char c):num(trans[n]),col(c){}
	
	bool operator<(const card& o)const
	{
		return num<o.num;
	}
};
struct hand
{
	int color[26];
	int number[256];
	vector<card> cards;
	int sameCol;
	int sameNum;
	int level;
	int score[6];
	hand()
	{
		memset(color,0,sizeof(color));
		memset(number,0,sizeof(number));
		memset(score,0,sizeof(score));
		sameCol=0;
		sameNum=0;
		level=0;
	}
	void addCard(card c)
	{
		color[c.col]++;
		number[c.num]++;
		sameCol=max(sameCol,color[c.col]);
		sameNum=max(sameNum,number[c.num]);
		cards.pb(c);
	}
	bool isCons()
	{
		sort(cards.begin(),cards.end());
		char pre=cards[0].num;
		for(int i=1;i<=4;i++)
		{
			if ( cards[i].num!=pre+1)
				return false;
			pre=cards[i].num;
		}
		return true;
	}
	void calScore()
	{
		sort(cards.begin(),cards.end());
		//同花顺
		if ( sameCol==5)
		{
			//同花顺
			if(isCons())
			{
				level=9;
				for(int i=4;i>=0;i--)
					score[4-i]=cards[i].num;
			}
			//同花
			else
			{
				level=6;
				for(int i=4;i>=0;i--)
					score[4-i]=cards[i].num;
			}
			return;
		}
		//铁支
		if ( sameNum==4)
		{
			int n1,n2;
			if (cards[0].num==cards[1].num)
				n1=cards[0].num,n2=cards[4].num;
			else
				n1=cards[4].num,n2=cards[0].num;
			score[0]=score[1]=score[2]=score[3]=n1;
			score[4]=n2;
			level=8;
			return;
		}	
		if ( sameNum==3 )
		{
			int n1,n2,n3;
			if ( cards[0].num==cards[2].num )
				n1=cards[0].num,n2=cards[3].num,n3=cards[4].num;
			else
				n1=cards[4].num,n2=cards[0].num,n3=cards[1].num;
			score[0]=score[1]=score[2]=n1;
			//葫芦
			if ( n2==n3 )
			{
				level=7;
				score[3]=score[4]=n2;
				//三条
			}
			else
			{
				level=4;
				score[3]=max(n2,n3);
				score[4]=min(n2,n3);
			}
			return;
		}
		//顺子
		if ( isCons() )
		{
			for(int i=4;i>=0;i--)
				score[4-i]=cards[i].num;
			level=5;
			return;
		}
		if ( sameNum==2)
		{
			int same1=-1,same2=-1;
			int sum=cards[0].num;
			for(int i=1;i<5;i++)
			{
				sum+=cards[i].num;
				if(cards[i].num==cards[i-1].num)
				{
					if(same1==-1)
						same1=cards[i].num;
					else
						same2=cards[i].num;
				}
			}
			//双对
			if ( same2!=-1)
			{
				level=3;
				score[0]=score[1]=max(same1,same2);
				score[2]=score[3]=min(same1,same2);
				score[4]=sum-same1*2-same2*2;
				return;
			}
			//单对
			else
			{
				score[0]=score[1]=same1;
				int j=2;
				for(int i=4;i>=0;i--)
				{
					if (cards[i].num!=same1)
						score[j++]=cards[i].num;
				}
				level=2;
				return ;
			}
		}
		//散牌
		level=1;
		for(int i=4;i>=0;i--)
			score[4-i]=cards[i].num;
		return;
	}
	int compare(const hand& o)const
	{
		if (level>o.level)
			return 1;
		else if (level<o.level)
			return -1;
		else
		{
			for(int i=0;i<5;i++)
			{
				if (score[i]>o.score[i])
					return 1;
				else if (score[i]<o.score[i])
					return -1;
			}
			return 0;
		}
	}
};
int main()
{
	char tmp[20];
	//A
	trans['A']=14;
	trans['K']=13;
	trans['Q']=12;
	trans['J']=11;
	trans['T']=10;
	trans['9']=9;
	trans['8']=8;
	trans['7']=7;
	trans['6']=6;
	trans['5']=5;
	trans['4']=4;
	trans['3']=3;
	trans['2']=2;
	while(1)
	{
		hand h[2];
		for(int i=0;i<2;i++)
		{
			for(int j=0;j<5;j++)
			{
				if(scanf("%s",tmp)==EOF)
					return 0;
				card tc(tmp[0],tmp[1]-'A');
				h[i].addCard(tc);
			}
		}
		h[0].calScore();
		h[1].calScore();
		int ans=h[0].compare(h[1]);
		if( ans>0)
			printf("Black wins.\n");
		else if (ans==0)
			printf("Tie.\n");
		else
			printf("White wins.\n");
	}
}

 

抱歉!评论已关闭.