解洛谷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,下面用编译器自动排版后的主题代码真的是和上面写了注释的几行格格不入……
函数名字很好理解,拼音首字母,通俗易懂,简单模拟,双链表模拟牌堆
具体解释日后再说

posted @ 2025-04-29 13:05  lee_liang  阅读(25)  评论(0)    收藏  举报