这道题哪里错了啊
题目在这里: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;
}