题目自己去找吧

记得数据范围是<=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. RabbitMQ(一):入门

    前言 最近学习了尚硅谷-RabbitMQ 受益匪浅,根据自己的理解做了下笔记,不正确的地方欢迎指正 正文 RabbitMQ是一个消息中间件,相当于一个中转站:用于接收.存储.转发消息数据 Rabbit ...

  2. 手撕LRU缓存了解一下

    面试官:来了,老弟,LRU缓存实现一下? 我:直接LinkedHashMap就好了. 面试官:不要用现有的实现,自己实现一个. 我:..... 面试官:回去等消息吧.... 大家好,我是程序员学长,今 ...

  3. Raid(0/1/5/10)

    一.Raid需要的硬盘数量 1.raid 0:     最少1块硬盘(但是1块盘没有意义,至少2块才有实际意义) 2.raid 1:     最少2块硬盘 3.raid 5:     最少3块硬盘 4 ...

  4. WEB安全性测试之文件上传漏洞

    1.漏洞描述:文件上传漏洞,是指可以利用WEB上传一些特定的文件包含特定代码如(<?php phpnfo;?> 可以用于读取服务器配置信息.上传成功后可以点击) 上传漏洞是指用户上传了一个 ...

  5. TypeScript 中高级类型的理解?有哪些?

    一.是什么 除了string.number.boolean 这种基础类型外,在 typescript 类型声明中还存在一些高级的类型应用 这些高级类型,是typescript为了保证语言的灵活性,所使 ...

  6. MySQL查询结果集字符串操作之多行合并与单行分割

    前言 我们在做项目写sql语句的时候,是否会遇到这样的场景,就是需要把查询出来的多列,按照字符串分割合并成一列显示,或者把存在数据库里面用逗号分隔的一列,查询分成多列呢,常见场景有,文章标签,需要吧查 ...

  7. djang2.1教育平台02

    在次申明,之所以重做这个资料是因为原幕课教程漏洞太多,新手根本没有办法正常照些学习,我凭着老男孩python 课程基础,重做这个教程 ,更改版本为当前最新版本,为了方法以后的人学习,并不是照着原文照  ...

  8. python 小鸡飞行小游戏

    python 小鸡飞行小游戏 用空格键控制小鸡飞行 代码 import pygame.freetype import sys import random pygame.init() screen = ...

  9. Dapr实战(一) 基础概念与环境搭建

    什么是Dapr Dapr 是一个可移植的.事件驱动的运行时,可运行在云平台或边缘计算中.支持多种编程语言和开发框架. 上面是官方对Dapr的介绍.有点难以理解,大白话可以理解为:Dapr是一个运行时, ...

  10. html input选择文件后将文件转为地址

    function getObjectURL(file) { var url = null; if (window.createObjectURL != undefined) { // basic ur ...