关于猪国杀

从今天下午大概 14:00开始看题 于19:26:23在 \(loj\) \(ac\)

减去吃饭核酸啥的,大概五个小时?(考场根本没分好吧

虽然打赌一下午写出来失败了,但是还是不错的吧?

不重要,关键是

没有大改,没有重构,框架一遍过

过程心态很好

练出心态就好

image
image

甚至两边有重复提交一份代码

下面是原版代码

code
#include<bits/stdc++.h>
using namespace std;
#define MP 3
#define ZP 1
#define FP 2
char in[100];
int n, m;
char muopai(){
	if(m){
		cin >> in;
		--m;
	}
	return in[0];
}
int cntfp;
struct PIG{
	int sf;//身份 1 忠 2 反 3 主
	bool jump_zhong, jump_fan, lei_fan, have_zhuangbei;
	int hp;
	int nxt, id, from;
	vector<char>sp;//手牌
	void mp(int x){//摸牌,张数
		for(int i = 1; i <= x; ++i)sp.push_back(muopai());
		// cout << " I mp :: ";
		// for(char c : sp)cout << c << " " ;
		// cout << endl;
	}
}p[15];
bool game_over;

void MAKE_DR(int from, int to){
	// cout << from << "bdy to " << to << endl;
	if(p[from].sf == MP)return;
	if(p[to].sf == MP || p[to].jump_zhong){p[from].jump_fan = 1;return;}
	if(p[to].jump_fan){p[from].jump_zhong = 1;return;}
}
void MAKE_FRIEND(int from, int to){
	// cout << from << " xyq to " << to << endl;
	if(p[to].sf == MP)p[from].jump_zhong = 1, p[from].lei_fan = 0;
	p[from].jump_fan |= p[to].jump_fan;
	p[from].jump_zhong |= p[to].jump_zhong;
}
void NEED_TAO(int x, int from){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'P'){p[x].sp.erase(y); ++p[x].hp; return;}
	p[p[x].from].nxt = p[x].nxt;
	p[p[x].nxt].from = p[x].from;
	if(p[x].sf == MP){game_over = 1; return;}
	if(p[x].sf == ZP && p[from].sf == MP){p[from].sp.clear(); p[from].have_zhuangbei = 0; return;}
	if(p[x].sf == FP){--cntfp; if(cntfp == 0){game_over = 1; return;} p[from].mp(3);}
}
bool NEED_SHAN(int x){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'D'){p[x].sp.erase(y);return true;}
	return false;
}
bool NEED_SHA(int x){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'K'){p[x].sp.erase(y);return true;}
	return false;
}
bool NEED_WXKJ(int x){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'J'){p[x].sp.erase(y);return true;}
	return false;
}
void USE_KILL(int from, int to){
	// cout << from << "use KILL to" << to << endl;
	if(p[from].sf != MP || p[to].sf != ZP)MAKE_DR(from, to);
	if(!NEED_SHAN(to)){--p[to].hp; if(p[to].hp < 1)NEED_TAO(to, from);}
}

bool check_make_friend(int now, int x){
	if(p[x].sf == MP && (p[now].sf == ZP || p[now].sf == MP))return true;
	if(p[x].jump_zhong && (p[now].sf == MP || p[now].sf == ZP))return true;
	if(p[x].jump_fan && p[now].sf == FP)return true;
	return false;
}
bool check_make_dr(int now, int x){
	if(now == x)return false;
	if(p[x].sf == MP && p[now].sf == FP)return true;
	if(p[x].jump_fan && (p[now].sf == MP || p[now].sf == ZP))return true;
	if(p[x].jump_zhong && p[now].sf == FP)return true;
	if(p[x].lei_fan && p[now].sf == MP)return true;
	return false;
}
bool get_WXKJ_dr(int x){
	int now = p[x].nxt;
	while(now != x){
		if(check_make_dr(now, x) && NEED_WXKJ(now)){
			MAKE_DR(now, x);
			if(get_WXKJ_dr(now) == false)return true;
			else return false;
		}
		now = p[now].nxt;
	}
	return false;
}
bool get_WXKJ_friend(int x, int used){
	int now = used;
	do{
		// if(now == 5 && x == 4)cout << check_make_friend(now, x) << " " << p[x].jump_fan << endl;
		if(check_make_friend(now, x) && NEED_WXKJ(now)){
			MAKE_FRIEND(now, x);
			if(get_WXKJ_dr(now) == false)return true;
			else return false;
		}
		now = p[now].nxt;
	}while(now != used);
	return false;
}

void USE_FIGHT(int from, int to){
	if(p[from].sf == MP && p[to].sf == ZP){
		if(get_WXKJ_friend(to, from))return;
		--p[to].hp;
		if(p[to].hp < 1)NEED_TAO(to, from);
		return;
	}
	MAKE_DR(from, to);
	if(get_WXKJ_friend(to, from))return;
	for(int round = 1; true; ++round){
		if(round & 1){
			if(NEED_SHA(to))continue;
			--p[to].hp;
			if(p[to].hp < 1)NEED_TAO(to, from);
		}
		else {
			if(NEED_SHA(from))continue;
			--p[from].hp;
			if(p[from].hp < 1)NEED_TAO(from, to);
		}
		break;
	}
}
void USE_NZRQ(int from){
	// cout << from << " used NZRQ" << endl;
	int now = p[from].nxt;
	while(now != from){
		int nxt = p[now].nxt;
		if(!get_WXKJ_friend(now, from))
			if(!NEED_SHA(now)){
				--p[now].hp;
				if(p[now].sf == MP)p[from].lei_fan = 1;
				if(p[now].hp < 1)NEED_TAO(now, from);
			}
		if(game_over)return;
		now = nxt;
	}
	// cout << p[now].hp << " " << p[now].jump_fan << " " << p[now].jump_zhong << " " << p[now].lei_fan << endl;

}
void USE_WJQF(int from){
	// cout << from << " used WJQF" << endl;
	int now = p[from].nxt;
	while(now != from){
		int nxt = p[now].nxt;
		if(!get_WXKJ_friend(now, from))
			if(!NEED_SHAN(now)){
				--p[now].hp;
				if(p[now].sf == MP)p[from].lei_fan = 1;
				if(p[now].hp < 1)NEED_TAO(now, from);
			}
		if(game_over)return;
		now = nxt;
	}
}
void print(){
	// for(int i = 1; i <= n; ++i){
	// 	cout << i << " " << p[i].hp << " ";
	// 		if(p[i].hp > 0){
	// 		for(char c : p[i].sp)cout << c << " ";
	// 		cout << endl;
	// 	}else cout << "DEAD\n";
	// }
	// cout << endl;
		// for(int i = 1; i <= n; ++i)cout << p[i].from << " " << p[i].nxt << "  ";

	// cout << endl;
}
int find_DR(int now){
	int l = p[now].nxt;
	while(l != now){
		if(p[l].hp < 1){
			l = p[l].nxt;
			continue;
		}
		if(p[now].sf == FP){
			if(p[l].sf == MP)return l;
			if(p[l].jump_zhong)return l;
		}
		if(p[now].sf == ZP){
			if(p[l].jump_fan)return l;
		}
		if(p[now].sf == MP){
			if(p[l].jump_fan ||(!p[l].jump_zhong && p[l].lei_fan))return l;
		}
		l = p[l].nxt;
	}
	return 0;
}
void play(int now){
	bool out = 1, CAN_KILL = 1;
	while(out && !game_over && p[now].hp > 0){
		out = 0;
		auto x = p[now].sp.begin();
		for(; x != p[now].sp.end(); ++x){
			if((*x) == 'P' && p[now].hp < 4){
				++p[now].hp; out = 1; p[now].sp.erase(x); break;
			}
			if((*x) == 'K' && (CAN_KILL || p[now].have_zhuangbei)){
				int dr = find_DR(now);
				if(dr == p[now].nxt){
					out = 1; CAN_KILL = 0;
					p[now].sp.erase(x);
					USE_KILL(now, dr);
					break;
				}
			}
			if((*x) == 'F'){
				int dr = find_DR(now);
				if(p[now].sf == FP)dr = 1;
				if(dr){
					out = 1;
					p[now].sp.erase(x);
					USE_FIGHT(now, dr);
					break;
				}
			}
			if((*x) == 'N'){
				p[now].sp.erase(x);
				out = 1;
				USE_NZRQ(now);
				break;
			}
			if((*x) == 'W'){
				p[now].sp.erase(x);
				out = 1;
				USE_WJQF(now);
				break;
			}
			if((*x) == 'Z'){
				p[now].have_zhuangbei = 1;
				p[now].sp.erase(x);
				out = 1;
				break;
			}
		}
		if(out)print();
	}
}

void start_game(){
	int now = 1;
	do{
		if(p[now].hp < 1){
			now = p[now].nxt;
			continue;
		}
		// cout << now << " ";
		p[now].mp(2);
		play(now);
		now = p[now].nxt;
	}while(!game_over);
}

int main(){
	cin >> n >> m;
	m += n * 4;
	for(int i = 1; i <= n; ++i){
		cin >> in;
		if(in[0] == 'M')p[i].sf = MP;
		if(in[0] == 'Z')p[i].sf = ZP;
		if(in[0] == 'F')p[i].sf = FP, ++cntfp;
		p[i].mp(4); p[i].hp = 4; p[i].nxt = i + 1; p[i].id = i; p[i].from = i - 1;
	}
	p[1].from = n;
	p[n].nxt = 1;
	start_game();
	if(cntfp)cout << "FP\n";
	else cout << "MP\n";
	for(int i = 1; i <= n; ++i)if(p[i].hp > 0){
		for(char c : p[i].sp)cout << c << " ";
		cout << endl;
	}else cout << "DEAD\n";
	return 0;
}

下面是简单整理的代码(没啥区别,就是删除了没有用的东西)

code
#include<bits/stdc++.h>
using namespace std;
#define MP 3
#define ZP 1
#define FP 2
char in[100];
int n, m, cntfp;
char muopai(){
	if(m){cin >> in;--m;}
	return in[0];
}
struct PIG{
	int sf, hp, nxt, from;
	bool jump_zhong, jump_fan, lei_fan, have_zhuangbei;
	vector<char>sp;
	void mp(int x){
		for(int i = 1; i <= x; ++i)sp.push_back(muopai());
	}
}p[15];
bool game_over;
void MAKE_DR(int from, int to){
	if(p[from].sf == MP)return;
	if(p[to].sf == MP || p[to].jump_zhong){p[from].jump_fan = 1;return;}
	if(p[to].jump_fan){p[from].jump_zhong = 1;return;}
}
void MAKE_FRIEND(int from, int to){
	if(p[to].sf == MP)p[from].jump_zhong = 1, p[from].lei_fan = 0;
	p[from].jump_fan |= p[to].jump_fan;
	p[from].jump_zhong |= p[to].jump_zhong;
}
void NEED_TAO(int x, int from){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'P'){p[x].sp.erase(y); ++p[x].hp; return;}
	p[p[x].from].nxt = p[x].nxt;
	p[p[x].nxt].from = p[x].from;
	if(p[x].sf == MP){game_over = 1; return;}
	if(p[x].sf == ZP && p[from].sf == MP){p[from].sp.clear(); p[from].have_zhuangbei = 0; return;}
	if(p[x].sf == FP){--cntfp; if(cntfp == 0){game_over = 1; return;} p[from].mp(3);}
}
bool NEED_SHAN(int x){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'D'){p[x].sp.erase(y);return true;}
	return false;
}
bool NEED_SHA(int x){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'K'){p[x].sp.erase(y);return true;}
	return false;
}
bool NEED_WXKJ(int x){
	auto y = p[x].sp.begin();
	for(; y != p[x].sp.end(); ++y)if((*y) == 'J'){p[x].sp.erase(y);return true;}
	return false;
}
void USE_KILL(int from, int to){
	if(p[from].sf != MP || p[to].sf != ZP)MAKE_DR(from, to);
	if(!NEED_SHAN(to)){--p[to].hp; if(p[to].hp < 1)NEED_TAO(to, from);}
}
bool check_make_friend(int now, int x){
	if(p[x].sf == MP && (p[now].sf == ZP || p[now].sf == MP))return true;
	if(p[x].jump_zhong && (p[now].sf == MP || p[now].sf == ZP))return true;
	if(p[x].jump_fan && p[now].sf == FP)return true;
	return false;
}
bool check_make_dr(int now, int x){
	if(now == x)return false;
	if(p[x].sf == MP && p[now].sf == FP)return true;
	if(p[x].jump_fan && (p[now].sf == MP || p[now].sf == ZP))return true;
	if(p[x].jump_zhong && p[now].sf == FP)return true;
	if(p[x].lei_fan && p[now].sf == MP)return true;
	return false;
}
bool get_WXKJ_dr(int x){
	int now = p[x].nxt;
	while(now != x){
		if(check_make_dr(now, x) && NEED_WXKJ(now)){
			MAKE_DR(now, x);
			if(get_WXKJ_dr(now) == false)return true;
			else return false;
		}
		now = p[now].nxt;
	}
	return false;
}
bool get_WXKJ_friend(int x, int used){
	int now = used;
	do{
		if(check_make_friend(now, x) && NEED_WXKJ(now)){
			MAKE_FRIEND(now, x);
			if(get_WXKJ_dr(now) == false)return true;
			else return false;
		}
		now = p[now].nxt;
	}while(now != used);
	return false;
}
void USE_FIGHT(int from, int to){
	if(p[from].sf == MP && p[to].sf == ZP){
		if(get_WXKJ_friend(to, from))return;
		--p[to].hp;
		if(p[to].hp < 1)NEED_TAO(to, from);
		return;
	}
	MAKE_DR(from, to);
	if(get_WXKJ_friend(to, from))return;
	for(int round = 1; true; ++round){
		if(round & 1){
			if(NEED_SHA(to))continue;
			--p[to].hp;
			if(p[to].hp < 1)NEED_TAO(to, from);
		}
		else {
			if(NEED_SHA(from))continue;
			--p[from].hp;
			if(p[from].hp < 1)NEED_TAO(from, to);
		}
		break;
	}
}
void USE_NZRQ(int from){
	int now = p[from].nxt;
	while(now != from){
		int nxt = p[now].nxt;
		if(!get_WXKJ_friend(now, from))
			if(!NEED_SHA(now)){
				--p[now].hp;
				if(p[now].sf == MP)p[from].lei_fan = 1;
				if(p[now].hp < 1)NEED_TAO(now, from);
			}
		if(game_over)return;
		now = nxt;
	}
}
void USE_WJQF(int from){
	int now = p[from].nxt;
	while(now != from){
		int nxt = p[now].nxt;
		if(!get_WXKJ_friend(now, from))
			if(!NEED_SHAN(now)){
				--p[now].hp;
				if(p[now].sf == MP)p[from].lei_fan = 1;
				if(p[now].hp < 1)NEED_TAO(now, from);
			}
		if(game_over)return;
		now = nxt;
	}
}
int find_DR(int now){
	int l = p[now].nxt;
	while(l != now){
		if(p[now].sf == FP){if(p[l].sf == MP || p[l].jump_zhong)return l;}
		if(p[now].sf == ZP){if(p[l].jump_fan)return l;}
		if(p[now].sf == MP){if(p[l].jump_fan ||(!p[l].jump_zhong && p[l].lei_fan))return l;}
		l = p[l].nxt;
	}
	return 0;
}
void play(int now){
	bool out = 1, CAN_KILL = 1;
	while(out && !game_over && p[now].hp > 0){
		out = 0;
		auto x = p[now].sp.begin();
		for(; x != p[now].sp.end(); ++x){
			if((*x) == 'P' && p[now].hp < 4){
				++p[now].hp; out = 1; p[now].sp.erase(x); break;
			}
			if((*x) == 'K' && (CAN_KILL || p[now].have_zhuangbei)){
				int dr = find_DR(now);
				if(dr == p[now].nxt){
					out = 1; CAN_KILL = 0;
					p[now].sp.erase(x);
					USE_KILL(now, dr);
					break;
				}
			}
			if((*x) == 'F'){
				int dr = find_DR(now);
				if(p[now].sf == FP)dr = 1;
				if(dr){
					out = 1;
					p[now].sp.erase(x);
					USE_FIGHT(now, dr);
					break;
				}
			}
			if((*x) == 'N'){
				p[now].sp.erase(x);
				out = 1;
				USE_NZRQ(now);
				break;
			}
			if((*x) == 'W'){
				p[now].sp.erase(x);
				out = 1;
				USE_WJQF(now);
				break;
			}
			if((*x) == 'Z'){
				p[now].have_zhuangbei = 1;
				p[now].sp.erase(x);
				out = 1;
				break;
			}
		}
	}
}
void start_game(){
	int now = 1;
	while(!game_over){
		p[now].mp(2);
		play(now);
		now = p[now].nxt;
	}
}
int main(){
	cin >> n >> m;
	m += n * 4;
	for(int i = 1; i <= n; ++i){
		cin >> in;
		if(in[0] == 'M')p[i].sf = MP;
		if(in[0] == 'Z')p[i].sf = ZP;
		if(in[0] == 'F')p[i].sf = FP, ++cntfp;
		p[i].mp(4); p[i].hp = 4; p[i].nxt = i + 1; p[i].from = i - 1;
	}
	p[1].from = n; p[n].nxt = 1;
	start_game();
	if(cntfp)cout << "FP\n";
	else cout << "MP\n";
	for(int i = 1; i <= n; ++i)if(p[i].hp > 0){
		for(char c : p[i].sp)cout << c << " ";
		cout << endl;
	}else cout << "DEAD\n";
	return 0;
}

2022.10.4

posted @ 2022-10-04 19:33  Chen_jr  阅读(270)  评论(2编辑  收藏  举报