题目自己去找吧

记得数据范围是<=10

注意事项:

1.牌库空的时候,要不断的抽第一张牌

2.反贼的决斗永远是向主公发的

3.每次判定无懈的时候,都是从使用锦囊的那个牌开始,记得敌意和殷勤的判断

4.只能向有身份的人无懈可击

5.有装备就装

#include<iostre am>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<vector> using namespace std; inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
} struct pig{
char a[100000];
int tot;
int blood;
int num;
int nxt;
int shan;
int sha;
int tao;
int wu;
int pre;
int biao;//0 啥也没有 1类反 2表反 3表忠
int shenfen;//1主公,2忠臣,3反贼
int nanman,wanjian,zhuge,jd;
bool dead;
bool weapon;
int atk;
}; pig a[15];
int n,m;
char paiku[2010];
int top;
int fanzei;
int start; void clear(int now,char p,int num)
{
for (int i=1;i<=a[now].tot;i++)
{
if (!num) break;
if (a[now].a[i]==p) num--,a[now].a[i]='*';
}
} int judge()
{
int fz=0;
for (int i=1;i<=n;i++)
{
if (a[i].dead && a[i].shenfen==3) fz++;
if (a[i].dead && a[i].shenfen==1) return 1;
}
if (fz==fanzei) return 2;
else return 0;
} void biaoyinqin(int now,int to)
{
if (now==to) return;
if (a[now].shenfen!=1)
{
if (a[to].shenfen==1) a[now].biao=3;
else
{
if (a[to].shenfen==1) a[now].biao=3;
if (a[to].biao==2) a[now].biao=2;
if (a[to].biao==3) a[now].biao=3;
}
}
} void biaodiyi(int now,int to)
{
if (now==to) return;
if (a[now].shenfen!=1)
{
if (a[to].shenfen==1) a[now].biao=2;
else
{
if (a[to].biao==2) a[now].biao=3;
if (a[to].biao==3) a[now].biao=2;
}
}
} void mopai(int num,int tot)
{
while (tot>0)
{
a[num].a[++a[num].tot]=paiku[top];
if (paiku[top]=='P') a[num].tao++;
if (paiku[top]=='K') a[num].sha++;
if (paiku[top]=='D') a[num].shan++;
if (paiku[top]=='J') a[num].wu++;
if (paiku[top]=='F') a[num].jd++;
if (paiku[top]=='N') a[num].nanman++;
if (paiku[top]=='W') a[num].wanjian++;
if (paiku[top]=='Z') a[num].zhuge++;
top=max(top-1,1);
tot--;
}
} bool peach(int now,int to)
{
if (a[now].tao>0 && a[to].blood<4)
{
a[to].blood++;
a[now].tao--;
clear(now,'P',1);
return true;
}
return false;
} void death(int now,int to)
{
a[to].dead=true;
if (judge()) return;
a[a[to].pre].nxt=a[to].nxt;
a[a[to].nxt].pre=a[to].pre;
if (a[now].shenfen==1 && a[to].shenfen==2)
{
a[now].weapon=false;
for (int i=1;i<=a[now].tot;i++) a[now].a[i]='*';
a[now].sha=a[now].shan=a[now].wu=a[now].tao=a[now].nanman=a[now].wanjian=a[now].jd=a[now].zhuge=0;
}
else
{
if (a[to].shenfen==3) mopai(now,3);
}
a[to].weapon=false;
for (int i=1;i<=a[to].tot;i++) a[to].a[i]='*';
a[to].sha=a[to].shan=a[to].wu=a[to].tao=a[to].nanman=a[to].wanjian=a[to].jd=a[to].zhuge=0;
a[to].dead=true;
} void damage(int now,int to)
{
a[to].blood--;
if (a[to].blood!=0) return;
if (!peach(to,to))
{
if (judge()) return;
death(now,to);
}
} void sha(int now,int to)
{
biaodiyi(now,to);
a[now].sha--;
clear(now,'K',1);
if (a[to].shan==0) damage(now,to);
else
a[to].shan--,clear(to,'D',1);
} bool gg(int now)
{
bool flag=false;
if ((a[now].biao==0 || a[now].biao==1 ) && a[now].shenfen!=1) return false;
int pos = a[now].nxt;
if (!flag)
{
while (pos!=now)
{
if (a[pos].wu>0 && ((a[now].shenfen==1 && a[pos].shenfen==3) ||(a[now].biao==3 && a[pos].shenfen==3)|| (a[now].biao==2 && a[pos].shenfen==2)|| (a[now].biao==2 && a[pos].shenfen==1)))
{
flag=true;
a[pos].wu--;
clear(pos,'J',1);
biaodiyi(pos,now);
break;
}
pos=a[pos].nxt;
}
}
if (flag) return !gg(pos);
return false;
} bool wuxie(int now,int st)
{
bool flag=false;
if ((a[now].biao==0 || a[now].biao==1 ) && a[now].shenfen!=1) return false;
if (a[st].wu>0 && ((a[now].shenfen==1 && a[st].shenfen==2) ||(a[now].biao==2 && a[st].shenfen==3) || (a[now].biao==3 && a[st].shenfen==2) || (a[now].biao==3 && a[st].shenfen==1)||(a[now].shenfen==1 && a[st].shenfen==1)))
{
flag=true;
a[st].wu--;
biaoyinqin(st,now);
clear(st,'J',1);
}
int pos =st;
if (!flag)
{
pos=a[st].nxt;
while (pos!=st)
{
if (pos!=now)
{
if (a[pos].wu>0 && ((a[now].shenfen==1 && a[pos].shenfen==2) ||(a[now].biao==2 && a[pos].shenfen==3) || (a[now].biao==3 && a[pos].shenfen==2) || (a[now].biao==3 && a[pos].shenfen==1)))
{
flag=true;
a[pos].wu--;
clear(pos,'J',1);
biaoyinqin(pos,now);
break;
}
}
else
{
if ((a[pos].biao!=0 && a[pos].biao!=1) || a[pos].shenfen==1)
{
if (a[pos].wu>0)
{
flag=true;
a[pos].wu--;
clear(pos,'J',1);
break;
}
}
}
pos=a[pos].nxt;
}
}
if (flag) return !gg(pos);
return false;
} void juedou(int now,int to)
{
biaodiyi(now,to);
a[now].jd--;
clear(now,'F',1);
if (a[now].shenfen==1 && a[to].shenfen==2)
{
a[to].blood--;
if (a[to].blood!=0) return;
if (!peach(to,to)) a[to].dead=true,death(now,to);
}
else
{
if (!wuxie(to,now))
{
int min1=min(a[now].sha,a[to].sha);
a[now].sha-=min1;a[to].sha-=min1;
clear(now,'K',min1);
clear(to,'K',min1);
if (a[to].sha==0)
{
damage(now,to);
}
else
{
a[to].sha--;
clear(to,'K',1);
damage(to,now);
}
}
}
} void nanmanruqin(int now)
{
a[now].nanman--;
clear(now,'N',1);
int pos = a[now].nxt;
while (pos!=now)
{
if (!wuxie(pos,now))
{
if (a[pos].sha>0)
{
a[pos].sha--,clear(pos,'K',1);
}
else
{
damage(now,pos);
if (a[pos].shenfen==1 && !a[now].biao) a[now].biao=1;
}
}
if (judge()) return;
pos=a[pos].nxt;
}
} void wanjianqifa(int now)
{
a[now].wanjian--;
clear(now,'W',1);
int pos = a[now].nxt;
while (pos!=now)
{
if (!wuxie(pos,now))
{
if (a[pos].shan>0)
a[pos].shan--,clear(pos,'D',1);
else
{
damage(now,pos);
if (a[pos].shenfen==1 && !a[now].biao) a[now].biao=1;
}
}
if (judge()) return;
pos=a[pos].nxt;
}
} int find(int now)
{
int pos = a[now].nxt;
while (a[pos].biao!=1 && a[pos].biao!=2 && pos!=now)
{
pos=a[pos].nxt;
}
if (pos==now) return 0;
else return pos;
} int find1(int now)
{
int pos = a[now].nxt;
while (a[pos].biao!=2 && pos!=now)
{
pos=a[pos].nxt;
}
if (pos==now) return 0;
else return pos;
} void print()
{
if (judge()==1)
{
cout<<"FP"<<endl;
}
else
cout<<"MP"<<endl;
for (int i=1;i<=n;i++)
{
if (a[i].dead)
{
printf("DEAD\n");
}
else
{
for (int j=1;j<=a[i].tot;j++)
{
if (a[i].a[j]!='*')
cout<<a[i].a[j]<<" ";
}
cout<<"\n";
}
}
} int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
a[i].blood=4;
char s[10];
scanf("%s",s+1);
if (s[1]=='M') a[i].shenfen=1,start=i;
if (s[1]=='Z') a[i].shenfen=2;
if (s[1]=='F') a[i].shenfen=3,fanzei++;
for (int j=1;j<=4;j++)
{
scanf("%s",s+1);
if (s[1]=='P') a[i].tao++;
if (s[1]=='K') a[i].sha++;
if (s[1]=='D') a[i].shan++;
if (s[1]=='J') a[i].wu++;
if (s[1]=='F') a[i].jd++;
if (s[1]=='N') a[i].nanman++;
if (s[1]=='W') a[i].wanjian++;
if (s[1]=='Z') a[i].zhuge++;
a[i].a[j]=s[1];
a[i].tot++;
}
}
top=m;
for (int i=1;i<=m;i++)
{
char s[10];
scanf("%s",s+1);
paiku[m-i+1]=s[1];
}
for (int i=1;i<=n-1;i++) a[i].nxt=i+1;
a[n].nxt=1;
for (int i=2;i<=n;i++) a[i].pre=i-1;
a[1].pre=n;
int now = 1;
while (!judge())
{
mopai(now,2);
bool flag=false;
for (int i=1;i<=a[now].tot;i++)
{
if (a[now].dead) break;
int mubiao=0;
if (a[now].shenfen==1)
{
mubiao=find(now);
}
if (a[now].shenfen==2)
{
mubiao=find1(now);
}
if (a[now].a[i]!='*')
{
if (a[now].a[i]=='K')
{
if ((a[now].weapon) || (!flag))
{
if ((a[now].shenfen==1 && a[a[now].nxt].biao==1) || (a[now].shenfen==1 && a[a[now].nxt].biao==2) || (a[now].shenfen==2 && a[a[now].nxt].biao==2) ||(a[now].shenfen==3 && a[a[now].nxt].shenfen==1) || (a[now].shenfen==3 && a[a[now].nxt].biao==3))
{
if (a[now].sha)
{
sha(now,a[now].nxt);
if (judge())
{
print();
return 0;
}
i=0;
flag=true;
}
}
}
}
if (a[now].a[i]=='P')
{
if (a[now].blood<4) peach(now,now),i=0;
}
if (a[now].a[i]=='F')
{
if (a[now].shenfen==1) {
if (mubiao)
{
juedou(now,mubiao);
i=0;
}
}
if (a[now].shenfen==2) {
if (mubiao)
{
juedou(now,mubiao);
i=0;
}
}
if (a[now].shenfen==3) {
juedou(now,start),i=0;
}
if (judge())
{
print();
return 0;
}
}
if (a[now].a[i]=='N')
{
nanmanruqin(now),i=0;
if (judge())
{
print();
return 0;
}
}
if (a[now].a[i]=='W')
{
wanjianqifa(now),i=0;
if (judge())
{
print();
return 0;
}
}
if (a[now].a[i]=='Z')
{
a[now].weapon=true,a[now].a[i]='*',i=0;
a[now].zhuge--;
if (judge())
{
print();
return 0;
}
}
}
}
now = a[now].nxt;
}
if (judge()==1)
{
cout<<"FP"<<endl;
}
else
cout<<"MP"<<endl;
for (int i=1;i<=n;i++)
{
if (a[i].dead)
{
printf("DEAD\n");
}
else
{
for (int j=1;j<=a[i].tot;j++)
{
if (a[i].a[j]!='*')
cout<<a[i].a[j]<<" ";
}
cout<<"\n";
}
}
return 0;
}

bzoj1972 SDOI2010-----猪国杀(模拟)的更多相关文章

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

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

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

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

  3. Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)

    猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...

  4. BZOJ1972: [Sdoi2010]猪国杀

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

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

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

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

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

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

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

  8. BZOJ1972:[SDOI2010]猪国杀

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

  9. [洛谷P2482][SDOI2010]猪国杀

    题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...

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

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

随机推荐

  1. roscore启动不完全问题

    运行roscore,得到如下日志,且一直卡着无法继续执行 ... logging to /home/xbit/.ros/log/79f2952c-589c-11ea-8213-d0abd5e7d222 ...

  2. 笔记本+ubuntu18.04 关闭触摸板touchpad

    方法1: Settings -> Devices -> Mouse&Touchpad -> Touchpad OFF 方法2: 终端运行如下命令 touchpad off:  ...

  3. WebService学习总结(四)--基于CXF的服务端开发

    本节将实践目前最流行的第二种web service 发布和调试框架  CXF Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩 ...

  4. css文本溢出省略号大总结,如你所愿

    一行: white-space: nowrap; text-overflow: ellipsis; overflow: hidden; word-break: break-all; 两行: width ...

  5. shell脚本书写

    #!/bin/bash #指定脚本默认使用的命令解释器 第1行 幻数 #!/usr/bin/python #!/bin/awk #!/bin/sed

  6. UNION / UNION ALL 区别

    Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序: Union All:对两个结果集进行并集操作,包括重复行,不进行排序: 使用union all: select top 5 ...

  7. 初识GDAL

    1.GDAL简介 GDAL(Geospatial Data Abstraction Library)是一个用于栅格数据操作的库,是开源地理空间基金会(Open Source Geospatial Fo ...

  8. AgileConfig轻量级配置中心1.4.0发布,重构了发布功能

    加入 NCC 先说一个事,AgileConfig 在 7 月底终于通过了 NCC 社区的审核,正式成为了 NCC 大家庭的一员.这对 AgileConfig 来说是一个里程碑,希望加入 NCC 后能更 ...

  9. 页面调用系统window打印

    一. 打印:直接页面调用window.print(),当前页面就会转换成打印页面 当前页面是使用HTML拼接成A4纸表格样式的展示: doPrint:function(type) { // this. ...

  10. weblogic之XXE利用与分析

    weblogic之XXE利用与分析 本篇文章漏洞环境使用p神的CVE-2018-2628 本机IP:192.168.202.1 被攻击主机IP:192.168.202.129 一. xxer工具 1. ...