本地调试没问题,但提交全RE
查看原帖
本地调试没问题,但提交全RE
790268
fgcjd楼主2024/7/30 13:09

记录

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <climits>
#include <iomanip>
#include <string>
#include <vector>
using namespace std;
typedef long long ll;
int n, m;
struct pig{
	int hp, cnt, zhuge;
	char type, stype;
	char a[10010];
}a[15];
char card[10010], cardcnt;
void init_(){
	cin >> n >> m;
	for (int i = 1; i <= n; i++){
		a[i].hp = 4, a[i].cnt = 4, a[i].zhuge = 0;
		cin >> a[i].type >> a[i].a[1];
		cin >> a[i].a[1] >> a[i].a[2] >> a[i].a[3] >> a[i].a[4];
		if (a[i].type == 'M') a[i].stype = 'M';
	}
	for (int i = 1; i <= m; i++){
		cin >> card[i];
	}
}
void getcard(int i){
	a[i].cnt++;
	if (cardcnt < m) cardcnt++;
	a[i].a[a[i].cnt] = card[cardcnt];
}
void flatten(int i, int j){
	for (; j < a[i].cnt; j++){
		a[i].a[j] = a[i].a[j + 1];
	}
	a[i].cnt--;
}
int nxt(int i){
	do{
		i = i % n + 1;
	} while (!a[i].hp);
	return i;
}
int findc(int i, char t){
	for (int j = 1; j <= a[i].cnt; j++){
		if (a[i].a[j] == t) return i;
	}
	return -1;
}
bool is_end(){
	int M = 0, Z = 0, F = 0;
	for (int i = 1; i <= n; i++){
		if (a[i].hp){
			if (a[i].type == 'M') M++;
			else if (a[i].type == 'Z') Z++;
			else if (a[i].type == 'F') F++;
		}
	}
	if (M == 0 || F == 0) return 1;
}
bool check_end(){
	int M = 0, Z = 0, F = 0;
	for (int i = 1; i <= n; i++){
		if (a[i].hp){
			if (a[i].type == 'M') M++;
			else if (a[i].type == 'Z') Z++;
			else if (a[i].type == 'F') F++;
		}
	}
	if (M == 0) return 0; 
	if (F == 0) return 1;
	return 0;
}
bool do_dead(int k, int i){
	if (a[i].hp <= 0){
		int ip;
		while (a[i].hp <= 0 && (ip = findc(i, 'P')) && ip != -1){
			flatten(i, ip);
			a[i].hp++;
		}
		if (a[i].hp <= 0){
			if (is_end()) return 1;
			if (a[i].type == 'F'){
				getcard(k); getcard(k); getcard(k);
			}
			else if (a[k].type == 'M' && a[i].type == 'Z'){
				a[k].zhuge = 0;
				memset(a[i].a, 0, sizeof(a[i].a));
			}
			return 0;
		}
	}
	return 0;
}
void use_p(int i, int j){
	a[i].hp++;
	flatten(i, j);
}
int use_k(int i, int j){
	int ni = nxt(i);
	if (a[i].type == 'M'){
		if (a[ni].stype == 'L' || a[ni].stype == 'F'){
			flatten(i, j);
			int shan = findc(ni, 'D');
			if (shan != -1){
				flatten(ni, shan);
			}
			else{
				a[ni].hp--;
				return do_dead(i, ni);
			}
		}
	}
	else if (a[i].type == 'Z'){
		if (a[ni].stype == 'F'){
			flatten(i, j);
			a[i].stype = 'Z';
			int shan = findc(ni, 'D');
			if (shan != -1){
				flatten(ni, shan);
			}
			else{
				a[ni].hp--;
				return do_dead(i, ni);
			}
		}
	}
	else {
		if (a[ni].stype == 'M' || a[ni].stype == 'Z'){
			flatten(i, j);
			a[i].stype = 'F';
			int shan = findc(ni, 'D');
			if (shan != -1){
				flatten(ni, shan);
			}
			else{
				a[ni].hp--;
				return do_dead(i, ni);
			}
		}
	}
	return -1;
}
void use_z(int i, int j){
	flatten(i, j);
	a[i].zhuge = 1;
}
bool usecard(int i){
//	cout << "usecard:" << i << endl;
	char now;
	bool usek = 0;
	for (int j = 1; j <= a[i].cnt; j++){
		now = a[i].a[j];
		bool useflag = 0;
		switch (now){
			case 'P':
				if (a[i].hp < 4){
					useflag = 1;
					use_p(i, j);
				}
				break;
			case 'K':
				if (a[i].zhuge || !usek){
					int ret = use_k(i, j);
					if (ret == 1) return 1;
					else if (ret == 0){
						usek = 1;
						useflag = 1;
					}
//					cout << "zhuge:" << a[i].zhuge << " usek:" << usek << endl;
//					cout << "use:k" << endl;
				}
				break;
			case 'Z':
				if (a[i].zhuge == 0) useflag = 1;
				use_z(i, j);
				break;
		}
		if (useflag) j = 0;
	}
	return 0;
}
bool play(int i){
	getcard(i); getcard(i);
	return usecard(i);
}
void start(){
	for (int i = 1; is_end(); i = nxt(i)){
		if (play(i)) break;
	}
}
void print(){
	cout << (check_end() ? "MP\n" : "FP\n");
	for (int i = 1; i <= n; i++){
		if (a[i].hp <= 0) cout << "DEAD\n";
		else {
			for (int j = 1; j <= a[i].cnt; j++){
				cout << a[i].a[j] << (j == a[i].cnt ? "" : " ");
			}
			cout << (i == n ? "" : "\n");
		}
	}
}
int main(){
	init_();
	start();
	print();
	return 0;
}

2024/7/30 13:09
加载中...