RE求助!带注释!
查看原帖
RE求助!带注释!
1037637
Akabane_Karuma楼主2024/8/12 23:33
#include<bits/stdc++.h>
using namespace std;
int n,m,k,player,cnt;
//n,m,k如题意所示 player当前操作者编号
//cnt牌堆顶最后一张牌位置 
int player_card[31][19];
//所有玩家卡牌,第二层数组[19]表示18种牌每种数量 
string s;
string name[31],card[300005];
//name所有玩家名字,card所有卡牌 
string f_key[19]={"","A1","A2","A5","A9","A19","A49",
                  "A99","B1","B9","B19","C2","D2","E0",
				  "E49","E99","PASS","TURN","DOUBLE"};
//方便转换 
map<string,int> key;
//方便转换 
int f(int x,int p) //使用1~15某种牌时p的结果 
{
	if(x<=2)
	    return p+x;
	if(x==3)
	    return p+5;
	if(x==4)
	    return p+9;
	if(x==5)
	    return p+19;
	if(x==6)
	    return p+49;
	if(x==7)
	    return p+99;
	if(x==8)
	    return p-1;
	if(x==9)
	    return p-9;
	if(x==10)
	    return p-19;
	if(x==11)
	    return p*2;
	if(x==12)
	    return floor(p*1.0/2);
	if(x==13)
	    return 0;
	if(x==14)
	    return 49;
	return 99;
}
int fail(int x) //游戏失败 
{
	cout<<name[x]<<" lost the game."<<endl;
	for(int j=1;j<=18;j++)
		player_card[x][j]--;
	for(int j=1;j<=3;j++)
		player_card[x][key[card[++cnt]]]++;
}
int priority(int x,bool doubled) //p相同时判断优先级 
{
	if(x<=7)
	{
		if(doubled)
		    return 3;
		return 2;
	}
	if(x<=10)
	{
		if(doubled)
		    return 2;
		return 3;
	}
	if(x==11)
	{
		if(doubled)
		    return 4;
		return 1;
	}
	if(x==12)
	{
		if(doubled)
		    return 1;
		return 4;
	}
	return 5;
}
void put(int x,int y,int p) //输出出牌信息 
{
	cout<<name[x]<<" used "<<f_key[y]<<",now p="<<p<<"."<<endl;
}
int main()
{
	//freopen("P7506_1(1).in","r",stdin);
	player=1;cnt=0;
	memset(player_card,0,sizeof(player_card));
	key["A1"]=1;key["A2"]=2;key["A5"]=3;key["A9"]=4;
	key["A19"]=5;key["A49"]=6;key["A99"]=7;
	key["B1"]=8;key["B9"]=9;key["B19"]=10;
	key["C2"]=11;key["D2"]=12;
	key["E0"]=13;key["E49"]=14;key["E99"]=15;
	key["PASS"]=16;key["TURN"]=17;key["DOUBLE"]=18;
	cin>>n>>m>>k;
	for(int i=1;i<=n;i++) //读入姓名和初始卡牌 
	{
		cin>>s;
		name[i]=s;
		for(int j=1;j<=3;j++)
		{
			cin>>s;
			player_card[i][key[s]]++;
		}
	}
	for(int i=1;i<=k;i++) //读入所有卡牌 
	{
		cin>>s;
		card[++cnt]=s;
	}
	cnt=0;
	for(int i=1;i<=m;i++)
	{
		int p=0;
		bool turn=false,doubled=false;
		cout<<"Round "<<i<<":"<<endl; 
		while(p<=99)
		{
			if(player==0)
			    player+=n;
			if(doubled) //被double的情况 
			{
				if(player_card[player][16]) //pass
				{
					player_card[player][16]--;
					put(player,16,p);
					if(turn)
			            player--;
			        else
			            player++;
			        continue;
				}
				else if(player_card[player][17]) //turn
				{
					player_card[player][17]--;
					turn=1-turn;
					put(player,17,p);
					if(turn)
			            player--;
			        else
			            player++;
			        continue;
				}
				else if(player_card[player][18]) //double
				{
					player_card[player][18]--;
					put(player,18,p);
					if(turn)
			            player--;
			        else
			            player++;
			        continue;
				}
				else //没有解牌 
				{
					int minp=1000001,minc=-1;
					for(int j=1;j<=15;j++) //扫牌 
					{
						if(player_card[player][j])
						{
							int res=f(j,p);
							if((res<minp||res==minp&&priority(j,true)>priority(minc,true))&&res<=99)
							{
								minp=res;
								minc=j;
							}
						}
					}
					p=minp;
					if(p>99)//出不出牌,噶了 
					{
						fail(player);
						break;
					}
					put(player,minc,p);
					player_card[player][minc]--;
				}
				doubled=1-doubled;  //解除double 
				player_card[player][key[card[++cnt]]]++; //摸牌 
			}
			int maxp=-1000001,maxc=-1;
			for(int j=1;j<=15;j++)  //扫牌 
			{
				if(player_card[player][j])
				{
					//cout<<name[player]<<"canuse"<<f_key[j]<<endl;
					int res=f(j,p);
					if((res>maxp||res==maxp&&priority(j,false)>priority(maxc,false))&&res<=99)
					{
						maxp=res;
						maxc=j;
					}
				}
			}
			if(maxc==-1||maxp>99)
			{
				if(player_card[player][16]) //pass
				{
					player_card[player][16]--;
					put(player,16,p);
				}
				else if(player_card[player][17])//turn
				{
					player_card[player][17]--;
					turn=1-turn;
					put(player,17,p);
				}
				else if(player_card[player][18])//double
				{
					player_card[player][18]--;
					put(player,18,p);
					doubled=true;
				}
				else//出不出牌,噶了 
				{
					fail(player);
					break;
				}
			}
			else
			{
				p=maxp;
				put(player,maxc,p);
				player_card[player][maxc]--;//把牌删掉 
			}
			player_card[player][key[card[++cnt]]]++;//摸牌 
			if(turn)
			    player--;
			else
			    player++;
		}
	}
	return 0;
}
2024/8/12 23:33
加载中...