解洛谷P2482猪国杀
#pragma GCC optimize(2)//交洛谷时注释掉(Removed as it's not allowed in online judges)
#include <bits/stdc++.h>
//#include<atcoder/all>//Atcoder库,Atcoder打比赛必备
#define int long long //十年OI一场空,不开long long见祖宗(Ten years of OI, all in vain;Forget long long, and grief you'll gain.)
//#define N 400
using namespace std;
using ll=long long;
inline void read(int& a) {
int w=1;char c;a=0;
while((c=getchar())<'0'||c>'9')if(c=='-')w=-1;
do a=a*10+(c^48); while((c=getchar())>='0'&&c<='9');
a*=w;
}
void write(int x){
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
return ;
}
//memset(,0,sizeof );//数组不清空,亲人两行泪(Skip array cleanup, pay the price—Your folks will weep, not once but twice.)
const int N = 1e5;//边界条件令人狂,若用define CE亡(Debugging bounds will drive you mad;With #define, CE strikes bad.)
struct pig {
int cs, hp, next, last;
char id, card[2010]; bool zgln;
} a[20];
char kn[11], kpd[2005], sss[10];
int n, m, fz;
bool ed;
void mp(int x) {
if (!m) m++;
a[x].card[++a[x].cs] = kpd[m];
m--;
}
void js(int x, int y) {
for (int i = 1; i <= a[y].cs; i++)
if (a[y].card[i] == 'P') {
a[y].card[i] = 'U';
a[y].hp++;
return;
}
a[a[y].next].last = a[y].last;
a[a[y].last].next = a[y].next;
if (y == 1) { ed = true; return; }
if (a[y].id == 'F') fz--;
if (!fz) { ed = true; return; }
if (a[y].id == 'F') mp(x), mp(x), mp(x);
if (a[y].id == 'Z' && a[x].id == 'M') a[x].cs = 0, a[x].zgln = false;
}
void Kil(int x, int y) {
for (int i = 1; i <= a[y].cs; i++)
if (a[y].card[i] == 'D') {
a[y].card[i] = 'U';
return;
}
a[y].hp--;
if (!a[y].hp) js(x, y);
}
bool wxkj(int x, int y, int z) {
int i = x, pd = z ? y : x;
while (true) {
if (z == 1) {
if (kn[y] == a[i].id || (kn[y] == 'M' && a[i].id == 'Z') || (kn[y] == 'Z' && a[i].id == 'M')) {
for (int j = 1; j <= a[i].cs; j++) {
if (a[i].card[j] == 'J') {
a[i].card[j] = 'U';
kn[i] = a[i].id;
return !wxkj(i, x, 0);
}
}
}
} else {
if (((a[i].id == 'M' || a[i].id == 'Z') && kn[x] == 'F') || (a[i].id == 'F' && (kn[x] == 'M' || kn[x] == 'Z'))) {
for (int j = 1; j <= a[i].cs; j++) {
if (a[i].card[j] == 'J') {
a[i].card[j] = 'U';
kn[i] = a[i].id;
return !wxkj(i, x, 0);
}
}
}
}
i = a[i].next;
if (i == x) break;
}
return false;
}
void nmrq(int x) {
for (int i = a[x].next; i != x; i = a[i].next) {
if (!wxkj(x, i, 1)) {
int j;
for (j = 1; j <= a[i].cs; j++) {
if (a[i].card[j] == 'K') {
a[i].card[j] = 'U';
break;
}
}
if (j > a[i].cs) {
a[i].hp--;
if (i == 1 && kn[x] == 'U') kn[x] = 'L';
if (!a[i].hp) js(x, i);
if (ed) return;
}
}
}
}
void wjqf(int x) {
for (int i = a[x].next; i != x; i = a[i].next) {
if (!wxkj(x, i, 1)) {
int j;
for (j = 1; j <= a[i].cs; j++) {
if (a[i].card[j] == 'D') {
a[i].card[j] = 'U';
break;
}
}
if (j > a[i].cs) {
a[i].hp--;
if (i == 1 && kn[x] == 'U') kn[x] = 'L';
if (!a[i].hp) js(x, i);
if (ed) return;
}
}
}
}
void jd(int x, int y) {
int j, k;
if (wxkj(x, y, 1)) return;
if (x == 1 && a[y].id == 'Z') {
a[y].hp--;
if (!a[y].hp) js(x, y);
return;
}
j = k = 1;
while (true) {
while (a[y].card[j] != 'K' && j <= a[y].cs) j++;
if (j > a[y].cs) {
a[y].hp--;
if (!a[y].hp) js(x, y);
return;
} else a[y].card[j] = 'U';
while (a[x].card[k] != 'K' && k <= a[x].cs) k++;
if (k > a[x].cs) {
a[x].hp--;
if (!a[x].hp) js(y, x);
return;
} else a[x].card[k] = 'U';
}
}
void hh() {
char c;
ed = true;
if (fz) ed = false;
if (ed) return;
for (int i = 1; i; i = a[i].next) {
mp(i), mp(i);
bool kill = true;
for (int j = 1; j <= a[i].cs; j++) {
if (a[i].card[j] != 'U') {
if (!a[i].hp) break;
c = a[i].card[j];
if (c == 'P') {
if (a[i].hp != 4) a[i].hp++, a[i].card[j] = 'U';
continue;
} else if (c == 'K') {
if ((!kill && !a[i].zgln) || (a[i].id == 'M' && kn[a[i].next] != 'L' && kn[a[i].next] != 'F') || (a[i].id == 'Z' && kn[a[i].next] != 'F') || (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;
kill = false;
if (ed) return;
continue;
} else if (c == '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[k] == 'F')) {
a[i].card[j] = 'U';
jd(i, k);
kn[i] = a[i].id;
if (ed) return;
j = 0;
break;
}
}
continue;
} else if (c == 'N') {
a[i].card[j] = 'U';
nmrq(i);
if (ed) return;
j = 0;
continue;
} else if (c == 'W') {
a[i].card[j] = 'U';
wjqf(i);
if (ed) return;
j = 0;
continue;
} else if (c == 'Z') {
a[i].zgln = true;
a[i].card[j] = 'U';
j = 0;
continue;
}
}
}
}
}
signed main() {
read(n), read(m);
for (int i = 1; i <= n; i++) a[i].next = i + 1, a[i].last = i - 1;
a[n].next = 1;
a[1].last = n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < 2005; j++) a[i].card[j] = 'U';
cin >> sss;
a[i].id = sss[0];
for (int j = 1; j <= 4; j++) {
cin >> sss;
a[i].card[j] = sss[0];
}
a[i].cs = a[i].hp = 4;
if (a[i].id == 'F') fz++;
a[i].zgln = false;
}
for (int i = 2; i <= n; i++) kn[i] = 'U';
kn[1] = 'M';
for (int i = 1; i <= m; i++) {
cin >> sss;
kpd[m - i + 1] = sss[0];
}
hh();
if (a[1].hp <= 0) cout << "FP" << endl;
else cout << "MP" << endl;
for (int i = 1; i <= n; i++) {
if (a[i].hp <= 0) cout << "DEAD" << endl;
else {
for (int j = 1; j <= a[i].cs; j++)
if (a[i].card[j] != 'U') cout << a[i].card[j] << ' ';
cout << endl;
}
}
return 0;
}
eee,下面用编译器自动排版后的主题代码真的是和上面写了注释的几行格格不入……
函数名字很好理解,拼音首字母,通俗易懂,简单模拟,双链表模拟牌堆
具体解释日后再说