求助,玄2关
查看原帖
求助,玄2关
736746
bananamilktea楼主2025/1/23 14:28
#include<bits/stdc++.h>

using namespace std;

const int MAXN = 3e3 + 1; 

int six_id;
int feel_six_pig[MAXN];           //feel_six_pig表示主猪堆第i个人的印象 
int ide[MAXN];                    //ide表示这个人是跳忠还是跳反 
int n, m;
vector<char> cards;               //抽牌堆 
set<pair<int, char>> st[MAXN];    //每个人手牌具体位置 
bool weapon[MAXN];
map<char, int> pigs_card[MAXN];   //每个人的手牌 
int pigs_hp[MAXN];                //血量 
int pigs_len[MAXN];
int pigs_type[MAXN];              //种类,记录当前猪是忠猪,主猪还是反猪 
vector<pair<int, char>> tmp;
bool all = false;

void print();
bool offset(int x, bool help);
void check_demage(int x, int y, bool all) { //判断是否死亡,如果死亡,判断是谁杀死的 
	if(pigs_hp[x] == 0) {
		if(pigs_card[x]['P']) {
			pigs_card[x]['P']--;
			pigs_hp[x]++;
			pair<int, char> now;
			for(auto i : st[x]) {
				if(i.second == 'P') {
					now = i;
					break;
				}
			}
			st[x].erase(now);
		}
	}
	if(pigs_hp[x] == 0) {
    	if(pigs_type[x] == 1) {
    		for(int i = 0; i < tmp.size(); i++) {
    			st[y].erase(tmp[i]);
			}
    		print();
		}
		int bad = 0;
		for(int i = 1; i <= n; i++) {
    		bad += (pigs_type[i] == 3 && pigs_hp[i] > 0);
		}
		if(bad == 0) {
    		for(int i = 0; i < tmp.size(); i++) {
    			st[y].erase(tmp[i]);
			}
			print();
		}
        if(pigs_type[y] == 1 && pigs_type[x] == 2) {    //大逆不道的主猪杀死了忠猪 
            pigs_card[y].clear();                       //小小的惩罚 
            st[y].clear();
        }
        if(pigs_type[x] == 3) {                         //小小的奖励 
            for(int i = 1; i <= 3; i++) {
                pigs_card[x][cards[cards.size() - 1]]++;
                st[y].insert({++pigs_len[y], cards[cards.size() - 1]});
                cards.pop_back();
            }
        }
    }
    else {                                             //改变伤害来源对全体猪的印象 
    	if(all) {
    		return;
		}
        if(pigs_type[x] == 1) {
            ide[y] = 3;
            ide[1] = 1;
            feel_six_pig[y] = 1;
        }
        if(pigs_type[x] == 2) {
            ide[y] = 3;
            ide[1] = 1;
        }
        if(pigs_type[x] == 3) {
            ide[y] = (y == six_id ? 1 : 2);
        }
    }
    return;
}
void Fight(int x, int y) {                            //决斗 
	if(offset(y, true)) {
		return;
	}
    bool turn = true;
    if(pigs_type[y] == 2 && pigs_type[x] == 1) {      //忠猪不打主猪 
        pigs_hp[y]--;
        check_demage(y, x, true);
        return;
    }
    while(1) {
        if(turn == true) {
            if(pigs_card[y]['K'] <= 0) {
                break;
            }
            else {
                pigs_card[y]['K']--;
				pair<int, char> now;
				for(auto i : st[y]) {
					if(i.second == 'K') {
						now = i;
						break;
					}
				}
				st[y].erase(now);
            }
        }
        else {
            if(pigs_card[x]['K'] <= 0) {
                break;
            }
            else {
                pigs_card[x]['K']--;
				pair<int, char> now;
				for(auto i : st[x]) {
					if(i.second == 'K') {
						now = i;
						break;
					}
				}
				st[x].erase(now);
            }
        }
        turn = !turn;
    }
    if(turn) {
        pigs_hp[y]--;
        check_demage(y, x, true);
    }
    else {
        pigs_hp[x]--;
        check_demage(x, y, false);
    }
    return;
}
bool offset(int x, bool help) {    //无懈可击抵消的阶段, help表示此轮如果使用无懈可击是表敌意还是献殷勤 
	int type_now = ide[x];
	int now = x % n + 1;
	if(type_now == 0) {
		return false;
	}
	if(ide[x] && pigs_card[x]['J'] && help) {                                                                    //自己手上有无懈可击并且表明身份,对自己有用则直接使用 
		pigs_card[x]['J']--;
		return offset(x, !help);
	}
	while(now != x) {
		if(pigs_card[now]['J'] && ide[now]) {
			if((type_now == 1 || type_now == 2) && help && (pigs_type[x] == 1 || pigs_type[x] == 2)) {          //都是主猪忠猪,互相帮助 
				ide[now] = (now == six_id ? 1 : 2);
				pigs_card[now]['J']--;
				pair<int, char> Now;
				for(auto i : st[now]) {
					if(i.second == 'J') {
						Now = i;
						break;
					}
				}
				st[now].erase(Now);
				return offset(now, !help);
			}
			if((type_now == 1 || type_now == 2) && !help && pigs_type[x] == 3) {                                //反猪对忠猪主猪表敌意 
				ide[now] = 3;
				pigs_card[now]['J']--;
				pair<int, char> Now;
				for(auto i : st[now]) {
					if(i.second == 'J') {
						Now = i;
						break;
					}
				}
				st[now].erase(Now);
				return offset(now, !help);
			}
			if(type_now == 3 && !help && (pigs_type[x] == 1 || pigs_type[x] == 2)) {                            //忠猪主猪对反猪表敌意 
				ide[now] = (now == six_id ? 1 : 2);
				pigs_card[now]['J']--;
				pair<int, char> Now;
				for(auto i : st[now]) {
					if(i.second == 'J') {
						Now = i;
						break;
					}
				}
				st[now].erase(Now);
				return offset(now, !help);
			}
			if(type_now == 3 && help && pigs_type[x] == 3) {                                                    //反猪对反猪献殷勤 
				ide[now] = -1;
				pigs_card[now]['J']--;
				pair<int, char> Now;
				for(auto i : st[now]) {
					if(i.second == 'J') {
						Now = i;
						break;
					}
				}
				st[now].erase(Now);
				return offset(now, !help);
			}
		}
		now = now % n + 1;
	}
	return false;
}
void Shoot(int x) {                //万箭齐发 
	for(int i = x + 1; i <= n; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['D']) {
			pigs_hp[i]--;
			check_demage(i, x, false);
		}
		else {
			pigs_card[i]['D']--;
			pair<int, char> now;
			for(auto j : st[i]) {
				if(j.second == 'D') {
					now = j;
					break;
				}
			}
			st[i].erase(now); 
		}
	}
	for(int i = 1; i < x; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['D']) {
			pigs_hp[i]--;
			check_demage(i, x, false);
		}
		else {
			pigs_card[i]['D']--;
			pair<int, char> now;
			for(auto j : st[i]) {
				if(j.second == 'D') {
					now = j;
					break;
				}
			}
			st[i].erase(now);
		}
	}
	return;
} 
void male_pig(int x) {                  //男猪入侵 
	for(int i = x + 1; i <= n; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['K']) {
			pigs_hp[i]--;
			check_demage(i, x, false);
		}
		else {
			pigs_card[i]['K']--;
			pair<int, char> now;
			for(auto j : st[i]) {
				if(j.second == 'K') {
					now = j;
					break;
				}
			}
			st[i].erase(now);
		}
	}
	for(int i = 1; i < x; i++) {
		if(offset(i, true)) {
			continue;
		}
		if(!pigs_card[i]['K']) {
			pigs_hp[i]--;
			check_demage(i, x, false);
		}
		else {
			pigs_card[i]['K']--;
			pair<int, char> now;
			for(auto j : st[i]) {
				if(j.second == 'K') {
					now = j;
					break;
				}
			}
			st[i].erase(now);
		}
	}
	return;
}
void Kill(int x, int y) {
	if(pigs_card[y]['D']) {
		pigs_card[y]['D']--;
		pair<int, char> now;
		for(auto i : st[y]) {
			if(i.second == 'D') {
				now = i;
				break;
			}
		}
		st[y].erase(now);
		return;
	}
	else {
		pigs_hp[y]--;
		check_demage(y, x, true);
	}
}
int FFind(int x) {
	int now = x % n + 1;
	while(now != x) {
		if(!pigs_hp[now]) {
			now = now % n + 1;
			continue;
		}
		if((pigs_type[x] == 1 || pigs_type[x] == 2) && ide[now] == 3 || pigs_type[x] == 3 && (ide[now] == 1 || ide[now] == 2) || pigs_type[x] == 1 && feel_six_pig[now] == 1) {
			return now;
		}
		now = now % n + 1;
	}
	return -1;
}
int Find(int x) {           //找冤大头表敌意 
	int now = x % n + 1;
	while(now != x) {
		if(!pigs_hp[now]) {
			now = now % n + 1;
			continue;
		}
		if((pigs_type[x] == 1 || pigs_type[x] == 2) && ide[now] == 3 || pigs_type[x] == 3 && (ide[now] == 1 || ide[now] == 2) || pigs_type[x] == 1 && feel_six_pig[now] == 1) {
			return now;
		}
		else {
			break;
		}
	}
	return -1;
}
bool check(int x, char c) {
	if(c == 'K') {
		int now = Find(x);
		if(now == -1) {
			return false;
		}
		else {
			return true;
		}
	}
	else if(c == 'F') {
		if(pigs_type[x] == 3) {
			return true;
		}
		else {
			int now = FFind(x);
			if(now == -1) {
				return false;
			}
			else {
				return true;
			}
		}
	}
	else if(c == 'D' || c == 'J') {
		return false;
	}
	else if(c == 'Z') {
		return true;
	}
	else if(c == 'P') {
		return pigs_hp[x] < 4;
	}
	else if(c == 'N') {
		return true;
	}
	else {
		return true;
	}
}
void use(int x, char c) {
	if(c == 'K') {
		int now = Find(x);
		Kill(x, now);
	}
	else if(c == 'F') {
		if(pigs_type[x] == 3) {
			Fight(x, 1);
		}
		else {
			int now = FFind(x);
			Fight(x, now);
		}
	}
	else if(c == 'Z') {
		weapon[x] = true;
	}
	else if(c == 'P') {
		pigs_hp[x]++;
	}
	else if(c == 'N') {
		male_pig(x);
	}
	else {
		Shoot(x);
	}
}
void pigs_round(int x) {
	bool Kill_used = false;
	tmp.clear();
	for(const auto& i : st[x]) {
		if(i.second == 'Z') {
			weapon[x] = true;
			break;
		}
	} 
	for(const auto& i : st[x]) {
		if(!weapon[x] && Kill_used && i.second == 'K') {
			continue;
		}
		if(check(x, i.second)) {
			pigs_card[x][i.second]--;
			tmp.push_back(i);
			use(x, i.second);
			Kill_used |= (i.second == 'K');
		}
	} 
	for(int i = 0; i < tmp.size(); i++) {
		st[x].erase(tmp[i]);
	}
	return;
}
void read() {                      //输入 
	cin >> n >> m;
	for(int i = 1; i <= n; i++) {
		string s;
		char c;
		cin >> s;
		if(s == "MP") {
			pigs_type[i] = 1;
		}
		else if(s == "ZP") {
			pigs_type[i] = 2;
		}
		else {
			pigs_type[i] = 3;
		}
		for(int j = 1; j <= 4; j++) {
			cin >> c;
			st[i].insert({++pigs_len[i], c});
			pigs_card[i][c]++;
		}
	}
	char last;
	for(int i = 0; i < m; i++) {
		char c;
		cin >> c;
		last = c;
		cards.push_back(c);
	}
	for(int i = 1; i <= 1000; i++) {
		cards.push_back(last);
	}
	reverse(cards.begin(), cards.end());
}
void init() {                      //初始化 
	fill(pigs_hp + 1, pigs_hp + n + 1, 4);
	ide[1] = 1;
}
void start() {                     //回合开始 
	int now = 1;
	while(1) {
		if(pigs_hp[now] <= 0) {
			now = now % n + 1;
			continue;
		}
		char p1 = cards[cards.size() - 1], p2 = cards[cards.size() - 2];
		st[now].insert({++pigs_len[now], p1});
		st[now].insert({++pigs_len[now], p2});
		pigs_card[now][p1]++;
		pigs_card[now][p2]++;
		cards.pop_back(), cards.pop_back();
		pigs_round(now);
//		for(int i = 1; i <= n; i++) {
//			cout << "hp : " << pigs_hp[i] << "\n";
//			for(auto j : st[i]) {
//				cout << j.second << " ";
//			}
//			cout << "\n";
//		}
//		cout << "\n";
		now = now % n + 1;
	}
}
void print() {                     //输出 
	if(pigs_hp[1] <= 0) {
		cout << "FP\n";
	}
	else {
		cout << "MP\n";
	}
	for(int i = 1; i <= n; i++) {
		if(pigs_hp[i] > 0) {
			for(auto j : st[i]) {
				cout << j.second << " ";
			}
			cout << "\n";
		}
		else {
			cout << "DEAD\n";
		}
	}
	exit(0);
}

int main() {
    read();
    init();
    start();
//    print();
    return 0;
}
2025/1/23 14:28
加载中...