码了一个上午,代码存到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;
}