谷甚论猪国杀(求助)
  • 板块灌水区
  • 楼主御坂10027号
  • 当前回复26
  • 已保存回复26
  • 发布时间2020/8/20 10:01
  • 上次更新2023/11/6 19:52:29
查看原帖
谷甚论猪国杀(求助)
99982
御坂10027号楼主2020/8/20 10:01

没打过那么长的代码,现在不知道该如何改TAT。 do,Misaka非常焦急但毫无办法

#include <bits/stdc++.h>

using namespace std;

char card_now[20][2010], card[200010], pig[20][20];
bool WQ[20], DEAD[20], used[20][2010];
int card_num[20], NUM;
int n, m, HP[20], YI[20][20], sum, qwq, qaq;

void PEACH(int from, int num, bool flag) {
	if(DEAD[from]) return ;
	int tot = num;
	if(!flag) for(int i = 1; i <= card_num[from]; ++i) {
		if(tot == 4) break;
		if(used[from][i]) continue;
		if(card_now[from][i] == 'P') ++tot, used[from][i] = true;
	}
	else for(int i = 1; i <= card_num[from]; ++i) {
		if(tot == 1) break;
		if(used[from][i]) continue;
		if(card_now[from][i] == 'P') ++tot, used[from][i] = true;
	}
	HP[from] = tot;
}

void MISS(int from, int to, int num) {
	if(DEAD[to] || DEAD[from]) return ;
	for(int i = 1; i <= card_num[to]; ++i) {
		if(used[to][i]) continue;
		if(card_now[to][i] == 'D') {
			used[to][i] = true;
			return ;
		}
	}
	HP[to]--;
	if(!YI[to][from] || YI[1][from] == 3) {
		if(pig[to][0] == 'M' && num == 0) YI[to][from] = 3;
		if(num == 1) {
			if(YI[from][to] == 1) for(int i = 1; i <= n; ++i) YI[i][from] = 2;
			if(YI[from][to] == 2) for(int i = 1; i <= n; ++i) YI[i][from] = 1;
		}
	}
	if(HP[to] <= 0) PEACH(to, HP[to], true);
	if(HP[to] <= 0) {
		if(pig[from][0] == 'M' && pig[to][0] == 'Z') {
			card_num[from] = 0;
			WQ[from] = false;
		}
		else if(pig[to][0] == 'F') {
			card_now[from][++card_num[from]] = card[++NUM];
			card_now[from][++card_num[from]] = card[++NUM];
			card_now[from][++card_num[from]] = card[++NUM];
			card_now[from][++card_num[from]] = card[++NUM];
		}
		if(pig[to][0] = 'F') qwq++;
		DEAD[to] = true;
	}
}

void KILL(int from, int to, int num) {
	if(DEAD[from] || DEAD[to]) return ;
	if(num == 0 || num == 3) {
		for(int i = 1; i <= card_num[from]; ++i) {
			if(card_now[from][i] == 'K' && !used[from][i]) {
				used[from][i] = true;
				return ;
			}
		}
		HP[to]--;
		if(!YI[to][from] || YI[1][from] == 3) {
			if(pig[to][0] == 'M' && num == 0) YI[to][from] = 3;
			if(num == 3) {
				if(YI[from][to] == 1) for(int i = 1; i <= n; ++i) YI[i][from] = 2;
				if(YI[from][to] == 2) for(int i = 1; i <= n; ++i) YI[i][from] = 1;
			}
		}
		if(HP[to] <= 0) PEACH(to, HP[to], true);
		if(HP[to] <= 0) {
			if(pig[from][0] == 'M' && pig[to][0] == 'Z') {
				card_num[from] = 0;
				WQ[from] = false;
			}
			else if(pig[to][0] == 'F') {
				card_now[from][++card_num[from]] = card[++NUM];
				card_now[from][++card_num[from]] = card[++NUM];
				card_now[from][++card_num[from]] = card[++NUM];
				card_now[from][++card_num[from]] = card[++NUM];
			}
			if(pig[to][0] = 'F') qwq++;
			DEAD[to] = true;
		}
	}
	else for(int i = 1; i <= num; ++i) MISS(from, to, 1);
}

bool WXKJ(int from) {
	if(DEAD[from]) return false;
	for(int i = 1; i <= card_num[from]; ++i) if(card_now[from][i] == 'J' && !used[from][i]) {
		used[from][i] = true;
		return true;
	}
	return false;
}

void solve_FIGHT(int from, int to) {
	if(DEAD[from] || DEAD[to]) return ;
	int HP_ = HP[to];
	KILL(from, to, 3);
	if(HP_ == HP[to]) solve_FIGHT(to, from);
}

void FIGHT(int from, int to) {
	if(DEAD[from] || DEAD[to]) return ;
	for(int i = 1; i <= card_num[from]; ++i) {
		if(card_now[from][i] == 'F' && !used[from][i]) {
			used[from][i] = true;
			if(YI[to][to] == 1) if(WXKJ(to)) return ;
			if(YI[to][to] == 2) if(WXKJ(to)) return ;
			if(pig[to][0] == 'Z' && pig[from][0] == 'M') {
				HP[to]--;
				if(HP[to] <= 0) PEACH(to, HP[to], true);
				if(HP[to] <= 0) {
					if(pig[from][0] == 'M' && pig[to][0] == 'Z') {
						card_num[from] = 0;
						WQ[from] = false;
					}
					else if(pig[to][0] == 'F') {
						card_now[from][++card_num[from]] = card[++NUM];
						card_now[from][++card_num[from]] = card[++NUM];
						card_now[from][++card_num[from]] = card[++NUM];
						card_now[from][++card_num[from]] = card[++NUM];
					}
					if(pig[to][0] = 'F') qwq++;
					DEAD[to] = true;
				}
				return ;
			}
			solve_FIGHT(from, to);
			return ;
		}
	}
}

void solve_NMRQ(int from) {
	if(DEAD[from]) return ;
	int x = from;
	if(from == n) x = 0;
	for(int i = x + 1; i <= n; ++i) {
		if(i == from) break;
		bool xx = false;
		int y = i;
		if(i == n) y = 0;
		for(int j = y + 1; j <= n; ++j) {
			if(i == j) break;
			if(pig[j][0] == 'Z' || pig[j][0] == 'M')
			if(YI[j][i] == 1)
			if(WXKJ(j)) {
				xx = true;
				for(int k = 1; k <= n; ++k) YI[k][j] = 1;
				break;
			}
			if(pig[j][0] == 'F')
			if(YI[j][i] == 2)
			if(WXKJ(j)) {
				xx = true;
				for(int k = 1; k <= n; ++k) YI[k][j] = 2;
				break;
			}
			if(j == i) j = 0;
		}
		if(!xx) KILL(from, i, 0);
		if(i == n) i = 0;
	}
}

void NMRQ(int from) {
	for(int i = 1; i <= card_num[from]; ++i) {
		if(card_now[from][i] == 'N' && !used[from][i]) {
			used[from][i] = true;
			solve_NMRQ(from);
			return ;
		}
	}
}

void solve_WJQF(int from) {
	if(DEAD[from]) return ;
	int x = from;
	if(from == n) x = 0;
	for(int i = x + 1; i <= n; ++i) {
		if(i == from) break;
		bool xx = false;
		int y = i;
		if(i == n) y = 0;
		for(int j = y + 1; j <= n; ++j) {
			if(i == j) break;
			if(pig[j][0] == 'Z' || pig[j][0] == 'M')
			if(YI[j][i] == 1 && (pig[i][0] == 'M' || pig[i][0] == 'Z'))
			if(WXKJ(j)) {
				xx = true;
				for(int k = 1; k <= n; ++k) YI[k][j] = 1;
				break;
			}
			if(pig[j][0] == 'F')
			if(YI[j][i] == 2 && pig[i][0] == 'F')
			if(WXKJ(j)) {
				xx = true;
				for(int k = 1; k <= n; ++k) YI[k][j] = 2;
				break;	
			}
			if(j == n) j = 0;
		}
		if(!xx) MISS(from, i, 0);
		if(i == n) i = 0;
	}
}

void WJQF(int from) {
	for(int i = 1; i <= card_num[from]; ++i) {
		if(card_now[from][i] == 'W' && !used[from][i]) {
			used[from][i] = true;
			solve_WJQF(from);
			return ;
		}
	}
}

int main() {
	cin >> n >> m;
	for(int i = 1; i <= n; ++i) {
		char a, b, c, d;
		cin >> pig[i] >> a >> b >> c >> d;
		card_now[i][++card_num[i]] = a;
		card_now[i][++card_num[i]] = b;
		card_now[i][++card_num[i]] = c;
		card_now[i][++card_num[i]] = d;
		YI[i][1] = 1;
		HP[i] = 4;
		if(pig[i][0] == 'F') qaq++;
	}
	for(int i = 1; i <= m; ++i) cin >> card[i];
	while(1) {
		//for(int i = 1; i <= n; ++i) cout << HP[i] << " ";
		for(int i = 1; i <= n; ++i) {
			if(DEAD[i]) continue;
			card_now[i][++card_num[i]] = card[++NUM];
			card_now[i][++card_num[i]] = card[++NUM];
			for(int j = 1; j <= card_num[i]; ++j)
			if(card_now[i][j] == 'Z' && !used[i][j]) used[i][j] = WQ[i] = true;
			int ss = 0;
			for(int j = 1; j <= card_num[i]; ++j) {
				if(card_now[i][j] == 'J' || card_now[i][j] == 'D' || used[i][j]) continue;
				if(card_now[i][j] == 'N') { NMRQ(i); continue; }
				if(card_now[i][j] == 'W') { WJQF(i); continue; }
				if(card_now[i][j] == 'F') {
					int x = i;
					if(i == n) x = 0;
					if(pig[i][0] == 'M') for(int k = x + 1; k <= n; ++k) {
						if(k == i) break;
						if(YI[i][k] == 2 && !DEAD[k]) {
							FIGHT(i, k);
							break;
						}
						if(k == n) k = 0;
					}
					if(pig[i][0] == 'Z') for(int k = x + 1; k <= n; ++k) {
						if(k == i) break;
						if(YI[i][k] == 2 && pig[k][0] == 'F' && !DEAD[i]) {
							FIGHT(i, k);
							break;
						}
						if(k == n) k = 0;
					}
					if(pig[i][0] == 'F') for(int k = x + 1; k <= n; ++k) {
						if(k == i) break;
						if(YI[i][k] == 1 && (pig[k][0] == 'M' || pig[k][0] == 'Z') && !DEAD[i]) {
							FIGHT(i, k);
							break;
						}
						if(k == n) k = 0;
					}
					continue;
				}
				if(card_now[i][j] == 'P') { PEACH(i, HP[i], false); continue; }
				if(card_now[i][j] == 'K') {
					if(ss && !WQ[i]) continue;
					int o = i, L = 0;
					if(i == n) o = 0;
					for(int k = o + 1; k <= n; ++k) {
						if(DEAD[k]) break;
						L++;
					}
					if(i + L + 1 > n) o = i + L + 1 % n;
					else o = i + L + 1;
					if(pig[i][0] == 'M') if(YI[i][o] == 2) KILL(i, o, 1);
					if(pig[i][0] == 'Z') if(YI[i][o + 1] == 2 && pig[o][0] == 'F') KILL(i, o, 1);
					if(pig[i][0] == 'F') if(YI[i][o + 1] == 1 && (pig[o][0] == 'M' || pig[o][0] == 'Z')) KILL(i, o, 1);
					ss++;
				}
			}
			if(qwq == qaq) {
				cout << "MP" << endl;
				for(int e = 1; e <= n; ++e) {
					if(DEAD[e]) cout << "DEAD" << endl;
					else {
						if(e == i) {
							int t;
							for(int r = 1; r <= card_num[e] - 3; ++r) if(!used[e][r]) {
								cout << card_now[e][r];
								t = r;
							}
							for(int r = r + 1; r <= card_num[e] - 3; ++r) cout << " " << card_now[e][r];
							cout << endl;
						}
						else {
							int t;
							for(int r = 1; r <= card_num[e]; ++r) if(!used[e][r]) {
								cout << card_now[e][r];
								t = r;
							}
							for(int r = r + 1; r <= card_num[e]; ++r) cout << " " << card_now[e][r];
							cout << endl;
						}
					}
				}
				return 0;
			}
			if(DEAD[1]) {
				cout << "FP" << endl;
				for(int e = 1; e <= n; ++e) {
					if(DEAD[e]) cout << "DEAD" << endl;
					else {
						int t;
							for(int r = 1; r <= card_num[e]; ++r) if(!used[e][r]) {
								cout << card_now[e][r];
								t = r;
							}
							for(int r = r + 1; r <= card_num[e]; ++r) cout << " " << card_now[e][r];
							cout << endl;
					}
				}
				return 0;
			}
		}
		
	}
}
/*
桃 / P
杀 / K
闪 / D
决斗 / F
南猪入侵 / N
万箭齐发 / W
无懈可击 / J
猪哥连弩 / Z
*/                                                                                                 
2020/8/20 10:01
加载中...