求助QWQ
  • 板块学术版
  • 楼主Hyvial
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/11/16 21:22
  • 上次更新2023/11/16 21:25:42
查看原帖
求助QWQ
1137394
Hyvial楼主2023/11/16 21:22

为什么!!!

猪国杀

#include <bits/stdc++.h>
#define LL long long
#define DB double

using namespace std;

int n, m, fz; // 反猪数量 
bool ed;
char kn[15];
char pa[2010], kp[2010]; // 卡牌堆 

struct Pigs
{
	int hp; // 血量 
	int cnt; // 牌的数量
	int last; // 上一只猪 
	int next; // 下一只猪
	char id; // 身份 
	bool zg; // 是否有猪哥连弩 
	char card[2010]; // 牌的种类(用字符串存放)
	 
}A[15];

char read() // 快读 每次读入一个字符 省略空格 
{
	char c = getchar();
	while(c < 'A' || c > 'Z') c = getchar(); // 如果不是就再来 
	return c;
 } 

// 摸牌 在击杀反猪后进行 
void mp(int x)
{
	if(!m) m++;
	A[x].card[A[x].cnt] = kp[m];
	A[x].cnt++;
	m--;
}

// 击杀x2 
void js(int x1, int x2)
{
	// 判断是否有桃(P)
	for(int i = 0; i < A[x2].cnt; i ++ )
	{
		if(A[x2].card[i] == 'P')
		{
			A[x2].card[i] = 'U';
			A[x2].hp++;
			return ;
		}
	}
	// 死亡改变
	A[A[x2].next].last = A[x2].last;
	A[A[x2].last].next = A[x2].next;
	// 如果主猪被杀
	if(x2 == 1)
	{
		ed = true;
		return ;
	 } 
	// 主猪杀忠猪 
	if(A[x1].id == 'M' && A[x2].id == 'Z')
	{
		A[x1].cnt = 0; // 弃置所有牌
		A[x1].zg = false;
	}
	// 杀反猪
	if(A[x2].id == 'F') fz--;
	if(!fz) 
	{
		ed = true;
		return ;
	}
	if(A[x2].id == 'F') mp(x1), mp(x1), mp(x1);
 } 
 
 // 杀(K) 
 void kil(int x1, int x2)
 {
 	for(int i = 0; i < A[x2].cnt; i ++ )
 	{
 		if(A[x2].card[i] == 'D')
 		{
 			A[x2].card[i] = 'U';
 			return ;
		 }
	 }
	A[x2].hp--;
	// 如果x2要GG了 是就进入击杀环节(js) 
	if(!A[x2].hp)
		js(x1, x2);
 }
 
// 无懈可击(J) 
bool wx(int x1, int x2, int x3)
{
	int i = x1;
	while(1)
	{
		// 如果这张锦囊牌有效 
		if(x3 == 1)
		{
			// 如果是攻击的是队友就无懈可击(J)掉 
			
			if(kn[x2] == A[i].id || (kn[x2] == 'M' && A[i].id == 'Z') || (kn[x2] == 'Z' && A[i].id == 'M'))
			{
				for(int j = 0; j < A[i].cnt; j ++ )
				{
					if(A[i].card[j] == 'J')
					{
						A[i].card[j] = 'U';
						kn[i] = A[i].id;
						return !wx(i, x1, 0);
					}
				}
			}
		}
		// 反之无效 
		else
		{
			// 如果攻击的是敌人就无懈可击(J)掉 
			if(((A[i].id == 'M' || A[i].id == 'Z') && kn[x1] == 'F') || (A[i].id == 'F' && (kn[x1] == 'M' || kn[x1] == 'Z')))
			{
				for(int j = 0; j < A[i].cnt; j ++ )
				{
					if(A[i].card[j] == 'J')
					{
						A[i].card[j] = 'U';
						kn[i] = A[i].id; 
						return !wx(i, x1, 0);
					}
				}
			}	
		}
		i = A[i].next;
		// 如果大家都没有无懈可击(或都没有自证) 又回到了原点就跳出 
		if(i == x1)
			break;
	}
	return false;
}

// 南猪入侵 
void nm(int x1)
{
	for(int x2 = A[x1].next; x2 != x1; x2 = A[x2].next)
	{
		if(!wx(x1, x2, 1))
		{
			int i;
			for(i = 0;i < A[x2].cnt; i ++ )
			{
				// 是否可以丢弃杀 
				if(A[x2].card[i] == 'K')
				{
					A[x2].card[i] = 'U';
					break;
				}
			}
			if(i >= A[x2].cnt)
			{
				A[x2].hp--;
				// 变成类反猪 
				if(x2 == 1 && kn[x1] == 'U') kn[x1] = 'L'; 
				if(!A[x2].hp) js(x1, x2);
				if(ed) return ;
			}
		}
	}
 } 

// 万箭齐发 
void wj(int x1)
{
	/*
	// 万箭齐发 
	void wj(int x1) 
	{ 
		for(int x2 = A[x1].next; x2 != x1; x2 = A[x2].next) 
		{ 
			if(!wx(x1, x2, 1)) 
			{ 
				int i = 0; 
				for(;i < A[x2].cnt; i ++ ) 
				{ // 是否可以丢弃杀 --》可丢弃 
					if(A[x2].card[i] == 'D') 
					{ 
						A[x2].card[i] = 'U'; 
						break; 
					} 
				} 
				if(i == A[x2].cnt) 
				{ 
					A[x2].hp--; 
					// 变成类反猪 
					if(x2 == 1 && kn[x1] == 'U') kn[x1] = 'L'; 
					if(!A[x2].hp) js(x1, x2); 
					if(ed) return ; 
				} 
			}
		}
	*/
	for(int x2 = A[x1].next; x2 != x1; x2 = A[x2].next)
	{
		if(!wx(x1, x2, 1))
		{
			int i;
			for(i = 0;i < A[x2].cnt; i ++ )
			{
				// 是否可以丢弃杀 
				if(A[x2].card[i] == 'D')
				{
					A[x2].card[i] = 'U';
					break;
				}
			}
			if(i >= A[x2].cnt)
			{
				A[x2].hp--;
				// 变成类反猪 
				if(x2 == 1 && kn[x1] == 'U') kn[x1] = 'L'; 
				if(!A[x2].hp) js(x1, x2);
				if(ed) return ;
			}
		}
		
	}
 } 
 
// 决斗
void jd(int x1, int x2)
{
	int j, k;
	if(wx(x1, x2, 1)) return ;
	if(x1 == 1 && A[x2].id == 'Z')
	{
		A[x2].hp--;
		if(!A[x2].hp) js(x1, x2);
		return ;
	}
	j = k = 0;
	while(1)
	{
		while(A[x2].card[j] != 'K' && j < A[x2].cnt) j++;
		if(j >= A[x2].cnt)
		{
			A[x2].hp--;
			if(!A[x2].hp) js(x1, x2);
			return ; 
		}
		else A[x2].card[j] = 'U';
		while(A[x1].card[k] != 'K' && k < A[x1].cnt) k++;
		if(k >= A[x1].cnt)
		{
			A[x1].hp--;
			if(!A[x1].hp) js(x2, x1);
			return ; 
		}
		else A[x1].card[k] = 'U';
	}
 } 

// 进入回合 
void hh()
{
	char nc;
	ed = true;
	if(fz) ed = false;
	if(ed) return ;
	// 现在的牌
	for(int i = 1;; i = A[i].next)
	{
		mp(i), mp(i);
		bool K = true;
		int j;
		for(j = 0; j < A[i].cnt; j ++ )
		{
			// 此牌没有弃置
			if(A[i].card[j] != 'U')
			{
				if(!A[i].hp) break;
				nc = A[i].card[j];
				// 桃 
				if(nc == 'P')
				{
					if(A[i].hp != 4) A[i].hp++, A[i].card[j] = 'U';
					continue;
				}
				if(nc == 'K')
				{
					if(!K && !A[i].zg) continue;
					if(A[i].id == 'M' && kn[A[i].next] != 'L' && kn[A[i].next] != 'F') continue;
					if(A[i].id == 'Z' && kn[A[i].next] != 'F') continue;
					if(A[i].id == 'F' && kn[A[i].next] != 'Z' && kn[A[i].next] != 'M') continue;
					A[i].card[j] = 'U';
					kil(i, A[i].next);
					kn[i] = A[i].id, K = false;
					if(ed) return ;
					continue;
				}
				if(nc == 'F')
				{
					if(A[i].id == 'F')
					{
						A[i].card[j] = 'U', jd(i, 1);
						kn[i] = A[i].id;
						if(ed) return ;
						j = -1;
						continue;
					}
					for(int k = A[i].next; k != i; k = A[k].next)
					{
						if((A[i].id == 'M' && (kn[k] == 'L' || kn[k] == 'F')) || (A[i].id == 'Z' && kn[i] == 'F'))
						{
							A[i].card[j] = 'U', jd(i, k);
							kn[i] = A[i].id;
							if(ed) return ;
							j = -1;
							break;
						}
					}
					continue;
				}
				if(nc == 'N')
				{
					A[i].card[j] = 'U';
					nm(i);
					if(ed) return ;
					j = -1;
					continue;
				}
				if(nc == 'W')
				{
					A[i].card[j] = 'U';
					wj(i);
					if(ed) return ;
					j = -1;
					continue;
				}
				if(nc == 'Z')
				{
					A[i].zg = true;
					A[i].card[j] = 'U';
					j = -1;
					continue;
				}
			}
		}
	 } 
}

int main()
{
	scanf("%d%d", &n, &m);
	
	for(int i = 1; i <= n; i ++ )
		A[i].next = i + 1, A[i].last = i - 1;
	A[1].last = n, A[n].next = 1;
	
	for(int i = 1; i <= n; i ++ )
	{
		for(int j = 0; j <= 2010; j ++ ) A[i].card[j] = 'U';
		char c[10];
		scanf("%s", &c);
		A[i].id = c[0];
		if(A[i].id == 'F') fz++;
		A[i].hp = A[i].cnt = 4;
		for(int j = 0;j < A[i].cnt; j ++ )
		{
			scanf("%s", &c);
			A[i].card[j] = c[0];
		}
		A[i].zg = false;
	}
	
	for(int i = 1;i <= m;i++)
	{
		char c[10];
		scanf("%s", &c);
		kp[m - i + 1] = c[0];
	}
	for(int i = 2; i <= n; i ++ ) kn[i] = 'U';
	kn[1] = 'M';
	
	hh();
	
	if(A[1].hp <= 0) printf("FP\n");
	else printf("MP\n");
	
	for(int i = 1; i <= n; i ++ )
	{
		if(A[i].hp <= 0) printf("DEAD");
		else
		{
			for(int j = 0; j < A[i].cnt; j ++ )
			{
				if(A[i].card[j] != 'U')
					printf("%c ", A[i].card[j]);
			}
		}
		printf("\n");
	}
	
    return 0;
    
}
  

2023/11/16 21:22
加载中...