这道题哪里错了啊啊啊
  • 板块学术版
  • 楼主Hyvial
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/11/10 20:53
  • 上次更新2023/11/10 22:01:01
查看原帖
这道题哪里错了啊啊啊
1137394
Hyvial楼主2023/11/10 20:53

这道题哪里错了啊

题目在这里:P2482猪国杀。

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

using namespace std;

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

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)
{
	A[x].card[++A[x].cnt] = pa.front();
	if(pa.size() > 1) pa.pop();
}

// 击杀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(A[x2].id == 'M') 
	{
		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 kill(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 <= 0)
		js(x1, x2);
 }
 
// 无懈可击(J) 
bool wx(int x1, int x2, int x3)
{
	int i = x1;
	while(1)
	{
		// 如果这张锦囊牌有效 
		if(x3)
		{
			// 如果是攻击的是队友就无懈可击(J)掉 
			if(A[i].id == kn[x2] || (A[x2].id == 'M' && kn[i] == 'Z') || (A[i].id == 'M' && kn[x2] == 'Z'))
			{
				for(int j = 0; i < A[i].cnt; j ++ )
				{
					if(A[i].card[j] == 'J')
					{
						A[i].card[j] = 'U';
						return !wx(i, x1, 0);
					}
				}
			}
		}
		// 反之无效 
		else
		{
			// 如果攻击的是敌人就无懈可击(J)掉 
			if(((A[i].id == 'M' || A[i].id == 'Z') && kn[i] == 'F'))
			{
				for(int j = 1; j < A[i].cnt; j ++ )
				{
					if(A[i].card[j] == 'J')
					{
						A[i].card[j] = 'U';
						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 = 0;
			for(;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)
{
	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 ;
			}
		}
		
	}
 } 
 
// 决斗
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 <= 0) 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 <= 0) 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 <= 0) js(x2, x1);
			return ; 
		}
		else A[x1].card[k] = 'U';
	}
 } 

// 进入回合 
void hh()
{
	char nc;
	// 现在的牌
	for(int i = 1; i; i = A[i].next)
	{
		bool K = true;
		mp(i); mp(i);
		for(int j = 0; j <= A[i].cnt; j ++ )
		{
			// 此牌没有弃置
			if(A[i].card[j] != 'U')
			{
				if(A[i].hp <= 0) 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] == 'Z') continue;
					if(A[i].id == 'Z' && kn[A[i].next] != 'F') continue;
					if(A[i].id == 'F' && kn[A[i].next] == 'F') continue;
					A[i].card[j] = 'U';
					kill(i, A[i].next);
					kn[i] = A[i].id;
					K = false;
					continue;
				}
				if(nc == 'K')
				{
					if(A[i].id == 'F')
					{
						A[i].card[j] = 'U';
						jd(i, 1);
						if(ed) return ;
						j = 0;
						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);
							j = 0;
							if(ed) return ;
							break;
						}
					}
					continue;
				}
				if(nc == 'N')
				{
					A[i].card[j] = 'U';
					nm(i);
					if(ed) return ;
					j = 0;
					continue;
				}
				if(nc == 'W')
				{
					A[i].card[j] = 'U';
					wj(i);
					if(ed) return ;
					j = 0;
					continue;
				}
				if(nc == 'Z')
				{
					A[i].card[j] = 'U';
					A[i].zg = true;
					j = 0;
					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].next = n, A[n].last = 1;
	for(int i = 1;i <= n;i++)
	{
		char c = read();
		if(c == 'F') fz++;
		read();
		A[i].hp = A[i].cnt = 4;
		for(int j = 0;j < A[i].cnt; j ++ )
			A[j].card[j] = read();
		A[i].zg = false;
	}
	for(int i = 0;i < m;i++)
	{
		char c = read();
		pa.push(c);
	}
	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 <= m; j ++ )
			{
				if(A[i].card[j] != 'U')
					printf("%c ", A[i].card[j]);
			}
			printf("\n");
		}
	}
    return 0;
}

2023/11/10 20:53
加载中...