加载中…

返回上一页

挑战猪国杀

码了一个上午,代码存到hz服务器上面了,结果因为服务器里有人删了我东西,导致我码没了,一个上午白干了......

然后下午从头开始.

码了一整个下午,终于把主体结构干完了. 一共276行.

然后,就是这个RE风波. 发现这个主猪(其实每个猪都是)一直剩着1血,苟延残喘,不停摸牌. 找了半天,居然是这里错了......

我开始设的布尔,结果就把它当char类型用了...

这个搞了我一个多小时.

然后WA90.

继续调,拿数据拍发现有一处牌没有访问到导致后面一错一串.

std:

wrong:

然后中间调的时候也发现几处小错误,但是对答案没有影响,应该是没有设这样的数据.

然后,就是:

我一天时间没了!

但是确实锻炼出了些码力.

扔一个码
#include<bits/stdc++.h>
#define ll int
#define rg register
#define rll rg ll
#define maxn 21
#define put_ putchar(' ')
#define putn putchar('\n')
using namespace std;
inline ll read()
{
	rll f=0,x=0;rg char ch=getchar();while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
	while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^'0'),ch=getchar();return f?-x:x;
}
inline void write(rll x) { if(x<0) putchar('-'),x=-x;if(x>9) write(x/10);putchar(x%10|'0'); }
struct node
{
	ll type,hp;// type:M.主猪 Z.忠猪 F.反猪
	ll nx,ls;// 下一个位置和上一个位置
	bool zb;// 装备
	vector<char> g;// 手牌,没有设成0
	// 桃/P  殺/K  闪/D
	// 决斗/F  南猪入侵/N
	// 万箭齐发/W  无懈可击/J
	// 猪哥连弩/Z
}pig[maxn];

char know[maxn];// 主猪知道的**类**反猪

ll n,m;

bool ed;// 结束标记
ll fz;// 反猪

char s[maxn];

queue<char> card;

inline void new_card(rll now)// 发牌
{
	// cout<<card.size()<<endl;
	pig[now].g.push_back(card.front());
	if(card.size()>1) card.pop();
}

inline void peach_dead(rll now1,rll now2)// 濒死吃桃
{
	// cout<<now1<<' '<<now2<<endl;
	for(rll i=0;i<pig[now2].g.size();i++)
		if(pig[now2].g[i]=='P')
		{
			pig[now2].g[i]=0;
			pig[now2].hp++;
			return;
		}
	pig[pig[now2].nx].ls=pig[now2].ls;
	pig[pig[now2].ls].nx=pig[now2].nx;
	// cout<<fz<<endl;
	if(now2==1) { ed=1;return; }
	if(pig[now2].type=='F') fz--;
	if(!fz) { ed=1;return; }
	if(pig[now2].type=='F') new_card(now1),new_card(now1),new_card(now1);
	if(pig[now2].type=='Z'&&pig[now1].type=='M') pig[now1].g.clear(),pig[now1].zb=0;
}

inline bool wxkj(rll now1,rll now2,rg bool op)// 无懈可击
{
	rll t=now1;
	do
	{
		if(op)
		{
			if(know[now2]==pig[t].type||(know[now2]=='M'&&pig[t].type=='Z')||(know[now2]=='Z'&&pig[t].type=='M'))
				for(rll i=0;i<pig[t].g.size();i++)
				{
					if(pig[t].g[i]=='J')
					{
						pig[t].g[i]=0; know[t]=pig[t].type;
						return (!wxkj(t,now1,0));
					}
				}
		}
		else
		{
			if(((pig[t].type=='M'||pig[t].type=='Z')&&know[now1]=='F')||((know[now1]=='M'||know[now1]=='Z')&&pig[t].type=='F'))
				for(rll i=0;i<pig[t].g.size();i++)
				{
					if(pig[t].g[i]=='J')
					{
						pig[t].g[i]=0; know[t]=pig[t].type;
						return (!wxkj(t,now1,0));
					}
				}
		}
		t=pig[t].nx;
	} while(t^now1);
	return 0;
}

inline void kill1(rll now1,rll now2)// 殺(还不允许用kill了?)
{
	rg bool fl=0;
	for(rll i=0;i<pig[now2].g.size();i++)
	{
		if(pig[now2].g[i]=='D')// 用“閃”
		{
			pig[now2].g[i]=0;
			fl=1;break;
		}
	}
	if(!fl) { pig[now2].hp--; if(pig[now2].hp<=0) peach_dead(now1,now2); }
}

inline void juedou(rll now1,rll now2)// 决斗
{
	// cout<<0;
	if(wxkj(now1,now2,1)) return;
	// cout<<1;
	if(now1==1&&pig[now2].type=='Z')
	{
		pig[now2].hp--; if(pig[now2].hp<=0) peach_dead(now1,now2);
		return;
	}

	rll cnt1=0,cnt2=0;
	while(1)
	{
		while((pig[now2].g[cnt2]^'K')&&cnt2<pig[now2].g.size()) cnt2++;
		if(cnt2==pig[now2].g.size())
		{
			pig[now2].hp--; if(pig[now2].hp<=0) peach_dead(now1,now2);
			return;
		}
		else pig[now2].g[cnt2]=0;
		while((pig[now1].g[cnt1]^'K')&&cnt1<pig[now1].g.size()) cnt1++;
		if(cnt1==pig[now1].g.size())
		{
			pig[now1].hp--; if(pig[now1].hp<=0) peach_dead(now2,now1);
			return;
		}
		else pig[now1].g[cnt1]=0;
	}
}

inline void nzrq(rll now1)// 南蛮入侵
{
	for(rll now2=pig[now1].nx;now2^now1;now2=pig[now2].nx)
		if(!wxkj(now1,now2,1))
		{
			rg bool fl=0;
			for(rll i=0;i<pig[now2].g.size();i++)
				if(pig[now2].g[i]=='K')
				{
					pig[now2].g[i]=0;fl=1;
					break;
				}
			if(!fl)
			{
				pig[now2].hp--;
				if(now2==1&&(!know[now1])) know[now1]=1;
				if(pig[now2].hp<=0) peach_dead(now1,now2);
				if(ed) return;
			}
		}
}

inline void wjqf(rll now1)// 万箭齐发
{
	for(rll now2=pig[now1].nx;now2^now1;now2=pig[now2].nx)
		if(!wxkj(now1,now2,1))
		{
			rg bool fl=0;
			for(rll i=0;i<pig[now2].g.size();i++)
				if(pig[now2].g[i]=='D')
				{
					pig[now2].g[i]=0;fl=1;
					break;
				}
			if(!fl)
			{
				pig[now2].hp--;
				if(now2==1&&(!know[now1])) know[now1]=1;
				if(pig[now2].hp<=0) peach_dead(now1,now2);
				if(ed) return;
			}
		}
}

inline void start()
{
	if(!fz) return;
	for(rll i=1;i;i=pig[i].nx)
	{
		// cout<<i<<endl;
		rg bool fl=0;// 是否已使用一张“殺”
		new_card(i);new_card(i);
		for(rll j=0;j<pig[i].g.size();j++)
		{
			if(pig[i].hp<=0) break;
			if(!pig[i].g[j]) continue;
			// cout<<i<<' '<<j<<' '<<pig[i].g[j]<<' '<<pig[i].hp<<endl;
			switch(pig[i].g[j])
			{
			case 'P':
				if(pig[i].hp^4)
					pig[i].g[j]=0,pig[i].hp++;
				break;
			case 'K':
				if(fl&&(!pig[i].zb)) break;
				if(pig[i].type=='M'&&(know[pig[i].nx]^1)&&(know[pig[i].nx]^'F')) break;
				if(pig[i].type=='F'&&(know[pig[i].nx]^'Z')&&(know[pig[i].nx]^'M')) break;
				if(pig[i].type=='Z'&&(know[pig[i].nx]^'F')) break;
				pig[i].g[j]=0; kill1(i,pig[i].nx);
				know[i]=pig[i].type;
				fl=1; if(ed) return;
				break;
			case 'F':
				if(pig[i].type=='F')
				{
					pig[i].g[j]=0;
					juedou(i,1); know[i]=pig[i].type;
					if(ed) return; j=-1; break;
				}
				for(rll k=pig[i].nx;k^i;k=pig[k].nx)
				{
					// write(k);put_;
					if((pig[i].type=='M'&&(know[k]==1||know[k]=='F'))||(pig[i].type=='Z'&&know[k]=='F'))
					{
						// putchar('*');
						pig[i].g[j]=0;
						juedou(i,k); know[i]=pig[i].type;
						if(ed) return; j=-1; break;
					}
				}
				// putn;
				break;
			case 'N':
				pig[i].g[j]=0; nzrq(i);
				if(ed) return; j=-1;
				break;
			case 'W':
				pig[i].g[j]=0; wjqf(i);
				if(ed) return; j=-1;
				break;
			case 'Z':
				pig[i].g[j]=0; pig[i].zb=1; j=-1;
				break;
			}
		}
	}
}

int main()
{
	// 读入部分
	n=read();m=read();
	for(rll i=1;i<=n;i++)
	{
		scanf("%s",s+1);
		pig[i].type=s[1]; if(s[1]=='F') fz++;
		for(rll j=1;j<=4;j++) scanf("%s",s+1),pig[i].g.push_back(s[1]);
		pig[i].hp=4; pig[i].ls=(i-2+n)%n+1; pig[i].nx=i%n+1;
	}
	know[1]='M';
	for(rll i=1;i<=m;i++) scanf("%s",s+1),card.push(s[1]);
	// 回合部分
	start();
	// 结束部分
	puts(pig[1].hp>0?"MP":"FP");
	for(rll i=1;i<=n;i++)
	{
		if(pig[i].hp<=0) { puts("DEAD"); continue; }
		for(rll j=0;j<pig[i].g.size();j++) if(pig[i].g[j]) putchar(pig[i].g[j]),put_;
		putn;
	}
	return 0;
}
posted @ 2022-10-09 20:41  1Liu  阅读(52)  评论(0编辑  收藏  举报