比较烦的中模拟。

注意事项:

  1. 猎人死时必须带走一个人。
  2. 女巫只有一份毒药和解药。
  3. 在同一晚,同一位女巫只能做一次操作。
  4. 如果错误撤回当晚所有操作

操作:

我们维护十个数组:

  • $die$,所有死亡的记录。
  • $nw1$,女巫的毒药操作。
  • $nw2$,女巫的解药操作。
  • $nd$,当晚死亡人数。
  • $nnw$,当晚女巫的操作。
  • $lr$,当晚狼人的操作。
  • $er$,猎人带走的操作。
  • $die1$,$die$ 的副本。
  • $nw1_1$,$nw1$ 的副本。
  • $nw2_1$,$nw2$ 的副本。

然后,几个 $\texttt {if}$ 判断一下:

  1. 判断是否出界。
  2. 判断是否死亡。
  3. 如果是猎人或女巫,要判断是否当晚死亡。
  4. 如果是狼人或女巫,要判断是否当晚用。

接着,记录死亡,是否用技能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(op==0){ //狼人
if(a[x]==1&&!die[x]&&!die[y]&&!lr[x]&&x<=n&&x&&y<=n&&y&&x!=y)
die[y]=1,nd[y]=1,lr[x]=1,er[y]=0;
else fg=1;}
if(op==1){ //毒药
if(a[x]==4&&!die[x]&&!die[y]&&!nw1[x]&&!nnw[x]&&x<=n&&x&&y<=n&&y&&x!=y)
die[y]=1,nw1[x]=1,nnw[x]=1,nd[y]=1,er[y]=0;
else fg=1;}
if(op==2){ //解药
if(a[x]==4&&!nw2[x]&&((!die[x]||x==y)&&die[y])&&!nnw[x]&&x<=n&&x&&y<=n&&y&&nd[y])
die[y]=0,nw2[x]=1,nd[y]=0,nnw[x]=1;
else fg=1;}
if(op==3){ //猎人
if(a[x]==3&&!er[x]&&nd[x]&&!die[y]&&x<=n&&x&&y<=n&&y&&x!=y)
die[y]=1,nd[y]=1,er[x]=1;
else fg=1;}

最后输出 $nd$ 就行了。