为什么编译错误啊,我的 猪国杀
我自己运行明明是对的啊!!!
#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(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)
js(x1, x2);
}
// 无懈可击(J)
bool wx(int x1, int x2, int x3)
{
int i = x1, pd = x3 ? x2 : 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 = 1;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;
bool f = false;
for(i = 0;i < A[x2].cnt; i ++ )
{
// 是否可以丢弃杀
if(A[x2].card[i] == 'D')
{
A[x2].card[i] = 'U';
f = true;
break;
}
}
if(!f)
{
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; i = A[i].next)
{
if(A[i].next == i) return ;
if(A[i].hp <= 0) continue;
if(ed || A[1].hp <= 0) return ;
mp(i); mp(i);
bool K = true;
for(int j = 0; j < A[i].cnt; j ++ )
{
if(A[i].next == i) return ;
if(A[i].hp <= 0) break;
// 此牌没有弃置
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] != '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';
kill(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 = 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);
kn[i] = A[i].id;
if(ed) return ;
j = 0;
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].zg = true;
A[i].card[j] = 'U';
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].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\n");
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;
}