题目自己去找吧

记得数据范围是<=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. VMware workstation16 中Centos7下MySQL8.0安装过程+Navicat远程连接

    1.MySQL yum源安装 2.安装后,首次登录mysql以及密码配置3.远程登录问题(Navicat15为例) 一.CentOS7+MySQL8.0,yum源安装1.安装mysql前应卸载原有my ...

  2. 并发编程之:Atomic

    大家好,我是小黑,一个在互联网苟且偷生的农民工. 在开始讲今天的内容之前,先问一个问题,使用int类型做加减操作是不是线程安全的呢?比如 i++ ,++i,i=i+1这样的操作在并发情况下是否会有问题 ...

  3. mysql各个版本驱动jar包下载 mysql/mysql-connector-java/5.1.22

    想下个jar csdn上全是要积分下载,这里记录下 下载地址,免得到时又要找 http://central.maven.org/maven2/mysql/mysql-connector-java/

  4. vue 用driver 添加用户引导

    npm 安装: npm install driver.js //用户引导 import Driver from 'driver.js' import 'driver.js/dist/driver.mi ...

  5. 使用 Dockerfile 自定义 Nginx 镜像

    一般来说,自定义Nginx只需要把静态文件放到镜像里就可以了,不需要重写 CMD 与 ENTRYPOINT.但是,如果的确需要在 Nginx 启动前执行一些操作,就需要重写 CMD 了,如果写成下边就 ...

  6. Docker(42)- 镜像原理之联合文件系统

    前言 学习狂神老师的 Docker 系列课程,并总结 镜像是什么 镜像是一种轻量级.可执行的独立软件保,用来打包软件运行环境和基于运行环境开发的软件 他包含运行某个软件所需的所有内容,包括代码.运行时 ...

  7. Git 初识和使用

    目录 目录 目录 概念 工作区/暂存区/版本库 master 版本号 常见命令 环境搭建 Linux 下 Git 和 GitHub 环境的搭建 Git 本地操作 本地仓库的创建和使用 查看信息 查看状 ...

  8. 计算字符串的长度.len,RuneCountInString

    内置函数len(),可以返回字符串/数组/切片/map/channel的长度. unicode/utf8包 函数:RuneCountInString(输入一个字符串),返回int类型的字符串长度.由于 ...

  9. 彻底解决Hive小文件问题

    最近发现离线任务对一个增量Hive表的查询越来越慢,这引起了我的注意,我在cmd窗口手动执行count操作查询发现,速度确实很慢,才不到五千万的数据,居然需要300s,这显然是有问题的,我推测可能是有 ...

  10. 【PHP数据结构】图的应用:最短路径

    上篇文章的最小生成树有没有意犹未尽的感觉呀?不知道大家掌握得怎么样,是不是搞清楚了普里姆和克鲁斯卡尔这两种算法的原理了呢?面试的时候如果你写不出,至少得说出个大概来吧,当然,如果你是要考研的学生,那就 ...