猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 







  题目可真长,读题都要一个小时。
  这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精神,本蒟蒻强行斯巴达了这群猪。
  为了给后面入坑的人一些提醒,本题题目较长,请耐心读完题目,否则会导致T,WA,E,特别想吃猪肉和丢脸。
  据说如果你耐心照着题目打你会得到30分,于是良心的我就先说一些题目没说或说的模糊或会坑你半个小时的东西。
    1.n<=10.
    2.牌堆会被摸完,此时一直取最后一张。(话说不能重新把废牌洗一下吗)
    3.无懈可击对非无懈可击是用时目的是要保护目标而不是恶心出牌人。
    4.可以给他人使用无懈可击(博主打过三国杀,但题目真心没说明白)
    5.可以不断用无懈可击无懈无懈可击。
    6.无懈可击使用时先从出锦囊牌的人开始判定是否打出无懈。
    7.使用决斗把自己干死时记得自己就不要出牌了。
    8.类反猪不算身份明了,该身份唯一的目的就是让主公去打他。
    9.不要瞎打else,博主被自己打的else坑了好几次。
    10.平时不要只学习,多打点游戏很重要,说不定下次联赛就考了狼人杀(我这么立flag是不是不太好,我又不会玩狼人杀)。
    11.数组在能开大的时候尽量开大点,就算是联赛也会出现数据大于给出的范围的情况。
  坑说完了,现在说一下我做这道题的时间线:
    第一天晚上:读题+扫雷+看指针恒直播AC,没打代码
    第二天上午:买了瓶饮料,开始斯巴达,打了一个上午,开始调试,中午吃猪。
    第二天晚上:花了不到30分钟调了一个小坑。
    第三天早上:花了不到30分钟又调了一个小坑。
    第三天下午:花了40分钟调完了最后一个坑,AC!!!Winner!Winner! Pig Dinner!
  说到底,还是一个大模拟,算法什么的真的用不到太高级的,撑死就是链表。
  好在题目没有给出内奸,闪电,防具,麒麟弓,猪物技能等设定,我们对于大部分操作我们基本对各个身份的猪一视同仁,游戏规则除了桃只能自己用以外和三国杀没什么不同。
  最恶心人的可能就只有两点,一个是无懈可击,一个是身份判断,因此我就只说这两个了,别的就按照暴力实现就好了。
   对于无懈可击,使用只有两种情况:
      1.对于无懈可击使用,是对那张无懈可击的使用者表敌意,身份显现。并且符合敌人的敌人就是朋友的性质。
      2.对于其他锦囊牌使用,对于即将挨打的那一方献殷勤,身份显现。
     因此我们对于对无懈可击对无懈可击使用的情况单独打一个函数,因为他会无限递归。而对于锦囊牌使用无懈,我们单独复制粘贴一下就好了。
   对于身份:
     我们基本可以认为只要出一张非南蛮和万箭的锦囊牌就会表示身份,值得注意的是我们要在出这张牌之前把他的身份更新,这样就会为无懈可击提供目标。类反猪只是一个临时身份,一旦他跳忠后就不会再被认为是类反猪,哪怕他不管主公死活狂刷南蛮。
  至于其他的,自己打一打也就差不多了。
 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#define N 15
#define M 2105
#define tao 1
#define sha 2
#define shan 3
#define jue 4
#define man 5
#define wan 6
#define wu 7
#define nu 8
using namespace std;
int pre[N],fro[N],n,m,zz;
int st[M],top;
struct pi
{
int ip;
int jump;
int q[M],en,hea,hp;
bool ln;
}pig[N];
char bbb[];
int check(char x)
{
if(x=='P') return tao;
else if(x=='K') return sha;
else if(x=='D') return shan;
else if(x=='F') return jue;
else if(x=='N') return man;
else if(x=='W') return wan;
else if(x=='J') return wu;
else return nu;
}
void get_pok(int x,int js)
{
if(js==)return;
if(!top) top=;
pig[x].en++;
pig[x].q[pig[x].en]=st[top];
top--;
get_pok(x,js+);
}
void zl(int x)
{
for(int j=pig[x].hea;j<=pig[x].en;j++)
{
if(pig[x].q[j]!=)
{
pig[x].hea=j;
for(int k=pig[x].en;k>=pig[x].hea;k--)
{
if(pig[x].q[k]!=)
{
pig[x].en=k;
break;
}
}
break;
}
if(j==pig[x].en)
{
pig[x].en=;
pig[x].hea=pig[x].en+;
}
}
}
void come_to_end(int x)
{
if(x==) printf("MP\n");
else printf("FP\n");
int js=;
for(int i=;i<=n;i++) if(pig[i].hp) js++;
for(int i=;i<=n;i++)
{
if(pig[i].hp==) printf("DEAD\n");
else
{
zl(i);
for(int j=pig[i].hea;j<pig[i].en;j++)
{
if(!pig[i].q[j])continue;
int y=pig[i].q[j];
if(y==tao)printf("P ");
else if(y==sha)printf("K ");
else if(y==shan)printf("D ");
else if(y==nu) printf("Z ");
else if(y==jue) printf("F ");
else if(y==man) printf("N ");
else if(y==wan) printf("W ");
else if(y==wu) printf("J ");
}
int y=pig[i].q[pig[i].en];
if(y==tao)printf("P");
else if(y==sha)printf("K");
else if(y==shan)printf("D");
else if(y==nu) printf("Z");
else if(y==jue) printf("F");
else if(y==man) printf("N");
else if(y==wan) printf("W");
else if(y==wu) printf("J");
printf("\n");
}
}
exit();
}
void gua(int x,int from)
{
pre[fro[x]]=pre[x];
fro[pre[x]]=fro[x];
if(x==) come_to_end();
int now=fro[];
bool yx=;
while(now!=)
{
if(pig[now].ip==)
{
yx=;
break;
}
now=fro[now];
}
if(yx)come_to_end();
if(pig[x].ip==&&pig[from].ip==)
{
memset(pig[from].q,,sizeof(pig[from].q));
pig[from].ln=;
pig[from].hea=,pig[from].en=;
}
else if(pig[x].ip==)
{
get_pok(from,);
}
}
void lost(int x,int from)
{
if(pig[x].hp==)
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==tao)
{
pig[x].hp++;
pig[x].q[i]=;
zl(x);
return ;
}
}
gua(x,from);
}
}
void kill(int x)
{
int to=fro[x];
bool yx=;
for(int i=pig[to].hea;i<=pig[to].en;i++)
{
if(pig[to].q[i]==shan)
{
pig[to].q[i]=;
yx=;
zl(to);
break;
}
}
if(yx)
{
pig[to].hp--;
lost(to,x);
}
}
bool use_wu(int x)
{
int now=fro[x];
while(now!=x)
{
if((pig[now].ip==&&pig[x].jump!=)||(pig[now].ip!=&&pig[x].jump==))
{
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
if(use_wu(now)) return ;
else return ;
}
}
}
now=fro[now];
}
return ;
}
void come_to_fight(int x,int y)
{
int now=fro[x];
if(pig[y].jump&&pig[y].jump!=-)
{
while(now!=x)
{
if((pig[now].ip==&&pig[y].jump==)||(pig[y].jump!=&&pig[now].ip!=))
{
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
yx=;
if(use_wu(now))return;
}
}
if(!yx)break;
}
now=fro[now];
}
}
if(pig[x].ip==&&pig[y].ip==)
{
pig[y].hp--;
lost(y,x);
return;
}
int js1=,js2=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
js1++;
}
}
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
{
js2++;
}
}
if(js1<js2)
{
int js3=;
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
{
js3++;
pig[y].q[i]=;
if(js3==js1+)break;
}
}
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
pig[x].q[i]=;
}
}
zl(x),zl(y);
pig[x].hp--;
lost(x,y);
}
else
{
int js3=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
if(js3==js2)break;
js3++;
pig[x].q[i]=;
}
}
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
pig[y].q[i]=;
}
zl(x),zl(y);
pig[y].hp--;
lost(y,x);
}
}
void nanman(int x)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while(now2!=x||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==sha)
{
pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void wanjian(int x)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while((now2!=x)||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==shan)
{ pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void second_stage(int x,int js)
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(!pig[x].q[i]||pig[x].q[i]==shan||pig[x].q[i]==wu||(pig[x].q[i]==sha&&js&&!pig[x].ln))continue;
if(pig[x].hp!=&&pig[x].q[i]==tao)
{
pig[x].hp++;
pig[x].q[i]=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==sha)
{
if(pig[x].ip==&&pig[fro[x]].jump&&pig[fro[x]].jump!=)
{
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&pig[fro[x]].jump==)
{
pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&(pig[fro[x]].jump==||pig[fro[x]].jump==))
{ pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
}
else if(pig[x].q[i]==nu)
{
pig[x].q[i]=;
pig[x].ln=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==jue)
{
if(pig[x].ip==)
{
int now=fro[];
while(now!=)
{
if(pig[now].jump==-||pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else if(pig[x].ip==)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
pig[x].jump=;
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else
{
pig[x].jump=;
pig[x].q[i]=;
zl(x);
come_to_fight(x,);
if(pig[x].hp==)return;
second_stage(x,js);
return;
}
}
else if(pig[x].q[i]==man)
{
pig[x].q[i]=;
zl(x);
nanman(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==wan)
{
pig[x].q[i]=;
zl(x);
wanjian(x);
second_stage(x,js);
return;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
pre[i]=i-;
fro[i]=i+;
pig[i].hp=;
scanf("%s",bbb);
if(bbb[]=='M')pig[i].jump=pig[i].ip=;
else if(bbb[]=='Z') pig[i].ip=;
else pig[i].ip=;
pig[i].hea=;
for(int j=;j<=;j++)
{
scanf("%s",bbb);
pig[i].en++;
pig[i].q[pig[i].en]=check(bbb[]);
}
}
pre[]=n;
fro[n]=;
top=m;
for(int i=;i<=m;i++)
{
scanf("%s",bbb);
st[top-i+]=check(bbb[]);
}
int now=;
while()
{
get_pok(now,);
second_stage(now,);
now=fro[now];
}
return ;
}

无注释版代码

  虽然博主打了五百多行,但主要还是因为博主码风剽悍,别急着放弃。一会就能打完。

 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <queue>
#include <algorithm>
#include <cmath>
#include <map>
#include <set>
#define N 15
#define M 2105
#define tao 1
#define sha 2
#define shan 3
#define jue 4
#define man 5
#define wan 6
#define wu 7
#define nu 8
using namespace std;
int pre[N],fro[N],n,m;
int st[M],top;//牌堆,注意为0时一直摸最后一张牌
struct pi
{
int ip;//身份
int jump;//是否跳反/忠
int q[M],en,hea,hp;//血量
bool ln;//是否有连弩
}pig[N];
char bbb[];
void print()//输出每一只猪的血量,身份,是否跳身份
{
for(int i=;i<=n;i++)
{
cout<<pig[i].hp<<' '<<pig[i].ip<<' '<<pig[i].jump<<endl;
}
cout<<endl;
}
void print2()//输出场上有哪些玩家存活
{
int now=;bool yx=;
while(now!=||yx)
{
yx=;
cout<<now<<' ';
now=fro[now];
}
cout<<endl;
}
void show(int x)//展示手牌
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i])
{
cout<<pig[x].q[i]<<' ';
}
}
cout<<endl<<endl;
}
int check(char x)
{
if(x=='P') return tao;
else if(x=='K') return sha;
else if(x=='D') return shan;
else if(x=='F') return jue;
else if(x=='N') return man;
else if(x=='W') return wan;
else if(x=='J') return wu;
else return nu;
}
void get_pok(int x,int js)//第x只猪摸的第js张牌
{
if(js==)return;
if(!top) top=;
pig[x].en++;
pig[x].q[pig[x].en]=st[top];
top--;
get_pok(x,js+);
}
void zl(int x)//整理玩家x手中的牌
{
for(int j=pig[x].hea;j<=pig[x].en;j++)
{
if(pig[x].q[j]!=)
{
pig[x].hea=j;
for(int k=pig[x].en;k>=pig[x].hea;k--)
{
if(pig[x].q[k]!=)
{
pig[x].en=k;
break;
}
}
break;
}
if(j==pig[x].en)
{
pig[x].en=;
pig[x].hea=pig[x].en+;
}
}
}
void come_to_end(int x)//一切都结束了
{
if(x==)
printf("MP\n");
else
printf("FP\n");
int js=;
for(int i=;i<=n;i++)
if(pig[i].hp)js++;
for(int i=;i<=n;i++)
{
if(pig[i].hp==) printf("DEAD\n");
else
{
zl(i);
for(int j=pig[i].hea;j<pig[i].en;j++)
{
if(!pig[i].q[j])continue;
int y=pig[i].q[j];
if(y==tao)printf("P ");
else if(y==sha)printf("K ");
else if(y==shan)printf("D ");
else if(y==nu) printf("Z ");
else if(y==jue) printf("F ");
else if(y==man) printf("N ");
else if(y==wan) printf("W ");
else if(y==wu) printf("J ");
}
int y=pig[i].q[pig[i].en];
if(y==tao)printf("P");
else if(y==sha)printf("K");
else if(y==shan)printf("D");
else if(y==nu) printf("Z");
else if(y==jue) printf("F");
else if(y==man) printf("N");
else if(y==wan) printf("W");
else if(y==wu) printf("J");
printf("\n");
}
}
exit();
}
void gua(int x,int from)//被from打挂了
{
cout<<from<<"has killed "<<x<<endl;
pre[fro[x]]=pre[x];
fro[pre[x]]=fro[x];
if(x==) come_to_end();
int now=fro[];
bool yx=;
while(now!=)
{
if(pig[now].ip==)
{
yx=;
break;
}
now=fro[now];
}
if(yx)come_to_end();
if(pig[x].ip==&&pig[from].ip==)
{
memset(pig[from].q,,sizeof(pig[from].q));
pig[from].ln=;
pig[from].hea=,pig[from].en=;
}
else if(pig[x].ip==)
get_pok(from,);
}
void lost(int x,int from)//检查是否死透
{
if(pig[x].hp==)
{
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==tao)
{
pig[x].hp++;
pig[x].q[i]=;
zl(x);
return ;
}
}
gua(x,from);
}
}
void kill(int x)//x对下家出杀
{
int to=fro[x];
cout<<x<<" hit "<<to<<endl;
bool yx=;
for(int i=pig[to].hea;i<=pig[to].en;i++)
{
if(pig[to].q[i]==shan)
{
pig[to].q[i]=;
yx=;
zl(to);
break;
}
}
if(yx)
{
cout<<to<<"is hurt!"<<endl;
pig[to].hp--;
lost(to,x);
}
}
bool use_wu(int x)//x使用无懈是否成功
{
int now=fro[x];
while(now!=x)
{
if((pig[now].ip==&&pig[x].jump!=)||(pig[now].ip!=&&pig[x].jump==))
{
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
if(use_wu(now)) return ;
else return ;
}
}
}
now=fro[now];
}
return ;
}
void come_to_fight(int x,int y)//x对y决斗
{
cout<<x<<"want to fight with "<<y<<endl;
int now=fro[x];
if(pig[y].jump&&pig[y].jump!=-)
{
while(now!=x)
{
if((pig[now].ip==&&pig[y].jump==)||(pig[y].jump!=&&pig[now].ip!=))
{
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==wu)
{
pig[now].q[i]=;
if(pig[now].ip==)pig[now].jump=;
else if(pig[now].ip==) pig[now].jump=;
zl(now);
yx=;
if(use_wu(now))return;
}
}
if(!yx)break;
}
now=fro[now];
}
}
if(pig[x].ip==&&pig[y].ip==)
{
pig[y].hp--;
lost(y,x);
return;
}
int js1=,js2=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
if(pig[x].q[i]==sha)js1++;
for(int i=pig[y].hea;i<=pig[y].en;i++)
if(pig[y].q[i]==sha) js2++;
if(js1<js2)
{
int js3=;
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
{
js3++;
pig[y].q[i]=;
if(js3==js1+)break;
}
}
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
pig[x].q[i]=;
}
}
zl(x),zl(y);
pig[x].hp--;
lost(x,y);
cout<<x<<"failed!"<<endl;
}
else
{
int js3=;
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(pig[x].q[i]==sha)
{
if(js3==js2)break;
js3++;
pig[x].q[i]=;
}
}
for(int i=pig[y].hea;i<=pig[y].en;i++)
{
if(pig[y].q[i]==sha)
pig[y].q[i]=;
}
zl(x),zl(y);
pig[y].hp--;
lost(y,x);
cout<<y<<"failed!"<<endl;
}
}
void nanman(int x) //南蛮入侵
{
cout<<"everyone need to give up a K or you will hurt by "<<x<<endl;
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while(now2!=x||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==sha)
{
pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void wanjian(int x) //万箭齐发
{
cout<<"everyone need to give up a D or you will hurt by "<<x<<endl;
int now=fro[x];
while(now!=x)
{
if(pig[now].jump&&pig[now].jump!=-)
{
bool yx2=;
int now2=x;
bool yxxx=;
while((now2!=x)||yxxx)
{
yxxx=;
if((pig[now2].ip==&&pig[now].jump==)||(pig[now2].ip!=&&pig[now].jump!=))
{
bool yx=;
for(int i=pig[now2].hea;i<=pig[now2].en;i++)
{
if(pig[now2].q[i]==wu)
{
pig[now2].q[i]=;
if(pig[now2].ip==)pig[now2].jump=;
else if(pig[now2].ip==) pig[now2].jump=;
zl(now2);
yx=;
if(use_wu(now2))
{
yx2=;
break;
}
else break;
}
}
if(!yx)break;
}
if(yx2)break;
now2=fro[now2];
}
if(yx2)
{
now=fro[now];continue;
}
}
bool yx=;
for(int i=pig[now].hea;i<=pig[now].en;i++)
{
if(pig[now].q[i]==shan)
{ pig[now].q[i]=;
zl(now);
yx=;
break;
}
}
if(yx)
{
pig[now].hp--;
if(now==&&!pig[x].jump)pig[x].jump=-;
lost(now,x);
}
now=fro[now];
}
}
void second_stage(int x,int js) //出牌阶段,出了几张杀
{
cout<<x<<' '<<js<<endl;
print();
for(int i=pig[x].hea;i<=pig[x].en;i++)
{
if(!pig[x].q[i]||pig[x].q[i]==shan||pig[x].q[i]==wu||(pig[x].q[i]==sha&&js&&!pig[x].ln))continue;
if(pig[x].hp!=&&pig[x].q[i]==tao)
{
cout<<x<<"come back to life"<<endl;
pig[x].hp++;
pig[x].q[i]=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==sha)
{
if(pig[x].ip==&&pig[fro[x]].jump&&pig[fro[x]].jump!=)
{
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&pig[fro[x]].jump==)
{
pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
else if(pig[x].ip==&&(pig[fro[x]].jump==||pig[fro[x]].jump==))
{
pig[x].jump=;
pig[x].q[i]=; zl(x);
kill(x);
second_stage(x,js+);
return;
}
}
else if(pig[x].q[i]==nu)
{
pig[x].q[i]=;
pig[x].ln=;
zl(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==jue)
{
if(pig[x].ip==)
{
int now=fro[];
while(now!=)
{
if(pig[now].jump==-||pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else if(pig[x].ip==)
{
int now=fro[x];
while(now!=x)
{
if(pig[now].jump==)
{
pig[x].q[i]=;
zl(x);
pig[x].jump=;
come_to_fight(x,now);
if(pig[x].hp==)return;
second_stage(x,js);
return;
break;
}
now=fro[now];
}
}
else
{
pig[x].jump=;
pig[x].q[i]=;
zl(x);
come_to_fight(x,);
if(pig[x].hp==)return;
second_stage(x,js);
return;
}
}
else if(pig[x].q[i]==man)
{
pig[x].q[i]=;
zl(x);
nanman(x);
second_stage(x,js);
return;
}
else if(pig[x].q[i]==wan)
{
pig[x].q[i]=;
zl(x);
wanjian(x);
second_stage(x,js);
return;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
pre[i]=i-;
fro[i]=i+;
pig[i].hp=;
scanf("%s",bbb);
if(bbb[]=='M')pig[i].jump=pig[i].ip=;//主公
else if(bbb[]=='Z') pig[i].ip=;//忠臣
else pig[i].ip=;//反贼
pig[i].hea=;
for(int j=;j<=;j++)
{
scanf("%s",bbb);
pig[i].en++;
pig[i].q[pig[i].en]=check(bbb[]);
}
}
pre[]=n;
fro[n]=;
top=m;
for(int i=;i<=m;i++)
{
scanf("%s",bbb);
st[top-i+]=check(bbb[]);
}
int now=;
while()
{
get_pok(now,);//当前猪摸牌
second_stage(now,);
now=fro[now];
}
return ;
}
/*3 4
MP J J K N
ZP J D K W
FP P N P K
J J K W 3 1
MP D N F K
ZP F W F N
FP D N N D
K 5 10
MP W D F K
ZP N N D D
FP F W W K
ZP K K N D
FP K D P W
J K W K D N N K J N 3 10
MP W D J W
ZP J P D N
FP N D F F
J D N N F J J D K W 3 6
MP W J J D
FP N F F K
ZP J J F F
P P K K F W
*/

带注释代码(附带小样例)

  由于博主十分中二,请不要嘲笑样例游戏解说般的画风。

Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)的更多相关文章

  1. 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】

    好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ...

  2. 洛谷P2482 [SDOI2010]猪国杀——题解

    猪国杀,模拟题的一颗耀眼的明珠,成长大牛.锻炼码力必写题! 模拟题没什么思维难度.只要按部就班地去做就是.模拟简单在这,难也在这.因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输.故推荐考试时碰见了, ...

  3. 【SDOI2010】猪国杀 题解(模拟)

    前言:嗅到了一丝头秃的味道…… ------------------ 题目链接 题目实在太长,变量也很多.建议至少读个三五遍再做题.不要忽略任何细节,不要想当然.(因为真正玩三国杀肯定不像猪一样出牌啊 ...

  4. BZOJ1972:[SDOI2010]猪国杀(模拟)

    Description 太长就不贴过来了 Solution 这个题是真的不难写……唯一的难度就在于理解题意上面……感觉这就是个阅读理解题啊…… 而且你三国杀玩的越多可能就越难写因为你无法理解那些猪的思 ...

  5. BZOJ1972: [Sdoi2010]猪国杀

    “此题注意样例少了个J,且牌堆可能用完牌,若牌用完则不停取最后一张”.——hzwer 然后直接模拟,认真读题,理清思路. #include<cstdio> #include<list ...

  6. Luogu2482 [SDOI2010]猪国杀 ---- 模拟

    Luogu2482 [SDOI2010]猪国杀 题意 ...... https://www.luogu.org/problemnew/show/P2482 总结 首先说一下代码的构思: 首先确定了所有 ...

  7. [BZOJ 1972][Sdoi2010]猪国杀

    1972: [Sdoi2010]猪国杀 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 364  Solved: 204[Submit][Status][D ...

  8. 【BZOJ1972】[SDOI2010] 猪国杀(恶心的大模拟)

    点此看题面 大致题意: 让你模拟一个游戏猪国杀的过程. 几大坑点 对于这种模拟题,具体思路就不讲了,就说说有哪些坑点. 题面有锅,反猪是\(FP\). 数据有锅,牌堆中的牌可能不够用,牌堆为空之后需一 ...

  9. BZOJ1972:[SDOI2010]猪国杀

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

随机推荐

  1. Interactive Data Display如何显示菜单?

    貌似直接跟其它控件一样添加菜单就行了. 不过这个版本已经取消了默认菜单,所有的菜单功能都得自己去实现.

  2. mysq练习(二)

    Mysql练习(二) 1. delete,drop,truncate 的区别? 可以参考这位的:  https://www.cnblogs.com/zhizhao/p/7825469.html 2. ...

  3. MyCat的初步了解

    MyCat 1 开源数据库中间件 MyCat   如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB.对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据 ...

  4. 电脑睡眠状态(ACPI规范定义了七个状态,使用powercfg -a进行查看)

    ACPI规范定义了一台兼容ACPI的计算机系统可以有以下七个状态(所谓的全局状态): G0('S0)正常工作状态:计算机的正常工作状态-操作系统和应用程序都在运行.CPU(s)执行指令.在这个状态下( ...

  5. CoolFormat(Qt Creator也可管理VC的Project)

    http://download.csdn.net/download/akof1314/8457593 https://github.com/akof1314/CoolFormat http://dow ...

  6. LockWindowUpdate

     //锁住listview防止反复刷新              LockWindowUpdate(Self.lvsearch.Handle);    貌似不太行,多用几下就卡住了  那个函数几乎不用 ...

  7. Qt自定义委托在QTableView中绘制控件、图片、文字(内容比较全)

    自定义委托,继承于,QStyledItemDelegate类,重载Paint()函数, 1.实现在QTableView中绘制 格式字符串 2.实现在QTableView中绘制进度条 3.实现在QTab ...

  8. Qt使用第三方库3rdparty

    简述 在 Qt 中经常会用到第三方库,例如:FFmpeg.OpenCV 等.第三方库的使用比较简单,只需要一些基本的配置就可以搞定,一起来看看吧! 简述 第三方库 源代码 库文件 目标目录 第三方库 ...

  9. 任何一件事,如果你不投入时间和精力去驯养,就不可能产生真正的兴趣和热爱(Focus Feedback FixIt的原理) good

    这两本书和我们说的兴趣结合起来,为我们指明了精进的道路: 选择一个你感兴趣的方向 刻意练习 持续投入时间和精力 所谓刻意练习,简单说就是“3F”,即: Focus Feedback Fix it Fo ...

  10. PNG透明窗体全攻略(控件不透明)

    http://blog.csdn.net/riklin/article/details/4417247 看好了,这是XP系统,未装.net.我的Photoshop学的不太好,把玻璃片弄的太透了些,如果 ...