没打过那么长的代码,现在不知道该如何改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
*/