bzoj1972: [Sdoi2010]猪国杀 模拟

模拟。认真读题,理清思路。

#include<cstdio>
#include<list>
#include<cstdlib>
const int N=10;
#define FOR(a,k)for(A k=P[a].begin();k!=P[a].end();++k)
using namespace std;
int n,m;
int HP[N],ST[N];
bool ID[N],Z[N];
list<char> P[N];
typedef list<char>::iterator A;
char q[2005];
void draw(int a,int v){
	static int s;
	while(v--)
		P[a].push_back(
		q[q[s+1]?s++:s]);
}
void discard(int a,A& k){
	P[a].erase(k++);
}
int next(int a){
	for(++a%=n;!HP[a];++a%=n);
	return a;
}
bool check(){
	for(int i=0;i!=n;++i)
		if(ID[i]&&HP[i])
			return 0;
	return 1;
}
void output(bool p){
	puts(p?"FP":"MP");
	for(int i=0;i!=n;++i)
		if(!HP[i])
			puts("DEAD");
		else{
			int s=0;
			FOR(i,k){
				q[s++]=*k;
				q[s++]=32;
			}
			q[s?s-1:s]=0;
			puts(q);
		}
	exit(0);
}
void end(int a,A& k,bool p){
	discard(a,k);
	output(p);
}
bool find(int a,char v){
	FOR(a,k)
		if(*k==v){
			discard(a,k);
			return 1;
		}
	return 0;
}
void kill(int a,int b,A& k){
	if(!--HP[b])
		if(find(b,‘P‘))
			++HP[b];
		else if(check())
			end(a,k,0);
		else if(!b)
			end(a,k,1);
		else if(ID[b])
			draw(a,3);
		else if(!a){
			P[a].clear();
			P[a].push_front(Z[a]=0);
			k=P[a].begin();
		}
}
void fight(int a,int b,A& k){
	if(!a&&!ID[b]){
		kill(a,b,k);
		return;
	}
	int t[]={a,b};
	bool v=1;
	A s[]={
		P[a].begin(),
		P[b].begin()
	};
	A* i=s+v;
	while(*i!=P[t[v]].end())
		if(**i!=‘K‘)
			++*i;
		else{
			discard(t[v],*i);
			i=s+(v^=1);
		}
	kill(t[v^1],t[v],k);
}
bool query(int a,int b){
	if(ST[b]<0||ST[b]>1)
		return 0;
	int i=a;
	bool v=0,res=0;
	do
		if(ID[i]==(ST[b]
		^v)&&find(i,‘J‘)){
			ST[i]=ID[i];
			a=b=i;
			v|=1;
			res^=1;
		}
	while((i=next(i))!=a);
	return res;
}
void attack(int a,int b,A& k){
	if(*k==‘K‘&&!find(b,‘D‘))
		kill(a,b,k);
	if(*k==‘F‘&&!query(a,b))
		fight(a,b,k);
	if(!(ST[b]<0||ST[b]>1))
		ST[a]=ST[b]^1;
}
char scan(){
	char s[3];
	scanf("%s",s);
	return *s;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=0;i!=n;++i){
		HP[i]=4;
		ST[i]=-1;
		if(scan()==‘F‘)
			ID[i]=1;
		for(int j=0;j!=4;++j)
			P[i].push_back(scan());
	}
	ST[0]=0;
	for(int i=0;i!=m;++i)
		q[i]=scan();
	if(check())
		output(0);
	for(int i=0;;i=next(i)){
		draw(i,2);
		bool v=0;
		while(HP[i]){
			A k=P[i].begin();
			int a=next(i),b=a;
			if(ID[i]){
				if(ST[a])
					a=i;
				b=0;
			}else if(i){
				if(ST[a]!=1)
					a=i;
				while(b!=i&&ST[b]!=1)
					b=next(b);
			}else{
				if(ST[a]<1)
					a=i;
				while(b!=i&&ST[b]<1)
					b=next(b);
			}
			while(k!=P[i].end()
			&&(*k==‘D‘||*k==‘J‘
			||*k==‘P‘&&HP[i]==4
			||*k==‘K‘&&(a==i||v&&!Z[i])
			||*k==‘F‘&&b==i))
				++k;
			if(k==P[i].end())
				break;
			if(*k==‘P‘)
				++HP[i];
			if(*k==‘K‘&&(!v++||Z[i]))
				attack(i,a,k);
			if(*k==‘F‘)
				attack(i,b,k);
			if(*k==‘N‘||*k==‘W‘){
				int j=i;
				while((j=next(j))!=i)
					if(!query(i,j)
					&&!find(j,*k==‘N‘?‘K‘:‘D‘)){
						kill(i,j,k);
						!j&&!~ST[i]?ST[i]=2:0;
					}
			}
			if(*k==‘Z‘)
				Z[i]=1;
			discard(i,k);
		}
	}
}

  

时间: 2024-08-08 13:58:05

bzoj1972: [Sdoi2010]猪国杀 模拟的相关文章

洛谷P2482 [SDOI2010]猪国杀

题目:https://www.luogu.org/problemnew/show/P2482 题目描述 <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色. 游戏目的: 主猪(MP):自己存活的情况下消灭所有的反猪. 忠猪(ZP):不惜一切保护主猪,胜利条件与主猪相同. 反猪(AP):杀死主猪. 游戏过程: 游戏开始时候,每个玩家手里都会有4张牌,且体力上限和初始体力都是4. 开始游戏时,从主猪开始,按照逆时

[SDOI2010]猪国杀

一个能看的题面 : https://mubu.com/doc/2707815814591da4 晚上闲的没事干被Refun忽悠着写猪国杀玩 然后一下子写到现在 浪费了一晚上+一上午 这题一堆肥肠SB的规则总之就是让你用他们的智商玩猪国杀 这是一篇没有任何意义的题解 附上10K的代码 然后那个忽悠我的人一直在嘲讽我写的长TAT #include<map> #include<cstdio> #include<vector> #include<cstring> #

Luogu P2482 [SDOI2010]猪国杀

Pig Country Kill 很古怪的翻译,不过它确实叫猪(Pig)国(Country)杀(Kill). 我们来好好整理一下这道题目.题面虽较长,但内容基本清晰,只是有部分很Pig的操作部分,很容易让第一次看见这道题目的人百思不得其解. 先整理一下这道长长的题面. First:人物 四位玩家,初始四张手牌,血量上限\(4\),初始血量\(4\),会告诉你整个牌堆的牌,每位玩家每个回合从牌堆顶部抽走两张牌,放在自己手牌的右侧.人物分主猪,忠猪,和反猪,主猪只有一只,反猪和忠猪可以有多只,反猪全

Luogu2482 [SDOI2010]猪国杀

题意 ...... https://www.luogu.org/problemnew/show/P2482 总结 题解好像没什么好写的 一些经验吧...... 提前分配好一些比较好的变量名 建议先声明函数再定义函数 打开Dev-C++的代码结构或者自己在草稿纸上写结构 每次调试之前自己浏览一遍代码并手推一遍样例,特别是修改了之后注意自己修改的地方,不要编译了历史版本 不要写的十分复杂,能简单写简单写 善用assert 善用注释 1 //Created By Creeper_LKF 2 //Cau

洛谷P2482 猪国杀

题目描述 <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色. 游戏目的: 主猪(MP):自己存活的情况下消灭所有的反猪. 忠猪(ZP):不惜一切保护主猪,胜利条件与主猪相同. 反猪(AP):杀死主猪. 游戏过程: 游戏开始时候,每个玩家手里都会有4张牌,且体力上限和初始体力都是4. 开始游戏时,从主猪开始,按照逆时针方向(数据中就是按照编号从1,2,3..n,1..的顺序)依次行动. 每个玩家自己的回合可以

Yali 19 - 8 - 6 test T2 猪国(pig) 题解

T2 猪国 题?描述 猪国是?个由 \(n\) 个城市组成的国家. 国王意识到了"要致富,先修路"这句话的重要性,它决定?规模修路.不巧的是,猪国的 猪们不太会?程,于是只能请隔壁鸡国的鸡建狂魔来帮忙修路.鸡建狂魔看不起猪,于是随 便建设了 \(m\) 条单向的路.尽管如此,每条路还是产?了或多或少的价值. 路修好了,经济却上不来.国王经过调研,发现了道路的巨?缺陷.具体来说,猪?们?向 感不好,?旦存在若?条路能组成?个环,那么可怜的猪?就有可能在环??绕来绕去,这 样甚?会产?反效

联赛之前的题表(已完成)汇总(可能有遗漏)

联赛之前的搞搞(其实是懒得分类) 博弈论 poj3537 poj1704 hdu5996两个插头 HDU1693 Eat the Trees COGS1283. [HNOI2004] 邮递员kdtree板子1941: [Sdoi2010]Hide and Seek旋转卡壳 pj2187凸包 cogs896 bzoj2829 信用卡凸包莫比乌斯反演基础 bzoj 4173 zhao gui lv bzoj 3529 mobiwus bzoj 4407 mobiwus bzoj 2818 mobiw

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734

大模拟祭

考试的前一天晚上我还在和$letong$说,我以后晚上再颓就去打模拟,然后就考了个大模拟 我比较$sb$,各种情况全分开了,没怎么压行,打了$1000$行整,$30$多$k$,妈妈再也不怕我打不出来猪国杀了 1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 int n,len,Std; 6 int b[5]; 7 char s[20],ss[20];