“此题注意样例少了个J,且牌堆可能用完牌,若牌用完则不停取最后一张”。——hzwer

然后直接模拟,认真读题,理清思路。

#include<cstdio>
#include<list>
#include<cstdlib>
#define FOR(a,k)\
for(iter k=p[a].begin();k!=p[a].end();++k)
using namespace std;
const int N=10;
int n,m,hp[N],st[N];
bool id[N],z[N];
list<char>p[N];
typedef list<char>::iterator iter;
char q[2005];
void draw(int a,int v){
static int s;
while(v--)
p[a].push_back(q[s+1^m?s++:s]);
}
int next(int a){
for(++a%=n;!hp[a];++a%=n);
return a;
}
bool check(){
for(int i=0;i!=n;++i)
if(id[i]&&hp[i])return 0;
return 1;
}
void output(bool j){
puts(j?"FP":"MP");
for(int i=0;i!=n;++i)
if(!hp[i])
puts("DEAD");
else{
int s=0;
FOR(i,k){
q[s++]=*k;
q[s++]=32;
}
q[s-!!s]=0;
puts(q);
}
exit(0);
}
bool find(int a,char v){
FOR(a,k)if(*k==v){
p[a].erase(k++);
return 1;
}
return 0;
}
void kill(int a,int b,iter&k){
if(!--hp[b])
if(find(b,'P'))
++hp[b];
else if(check()){
p[a].erase(k++);
output(0);
}
else if(!b){
p[a].erase(k++);
output(1);
}
else if(id[b])
draw(a,3);
else if(!a){
p[a]=list<char>(1);
z[a]=0;
k=p[a].begin();
}
}
void fight(int a,int b,iter&k){
if(!a&&!id[b])
return kill(a,b,k);
iter s[]={
p[a].begin(),p[b].begin()
};
int c[]={a,b},v=1;
iter*i=s+v;
while(*i!=p[c[v]].end())
if(**i!='K')
++*i;
else{
*i=p[c[v]].erase(*i);
i=s+(v^=1);
}
kill(c[v^1],c[v],k);
}
bool query(int a,int b){
if(st[b]<0||st[b]>1)
return 0;
int i=a;
bool v=0,res=0;
do
if(id[i]==(st[b]^v)&&find(i,'J')){
st[i]=id[i];
a=b=i;
v|=1;
res^=1;
}
while((i=next(i))!=a);
return res;
}
void attack(int a,int b,iter&k){
if(*k=='K'&&!find(b,'D'))
kill(a,b,k);
if(*k=='F'&&!query(a,b))
fight(a,b,k);
if(!(st[b]<0||st[b]>1))
st[a]=st[b]^1;
}
char scan(){
static char s[3];
scanf("%s",s);
return*s;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i!=n;++i){
hp[i]=4,st[i]=-1;
if(scan()=='F')
id[i]=1;
for(int j=0;j!=4;++j)
p[i].push_back(scan());
}
st[0]=0;
for(int i=0;i!=m;++i)
q[i]=scan();
if(check())
output(0);
for(int i=0;;i=next(i)){
draw(i,2);
bool y=0;
while(hp[i]){
iter k=p[i].begin();
int a=next(i),b=a;
if(id[i]){
if(st[a])
a=i;
b=0;
}
else if(i){
if(st[a]!=1)
a=i;
while(b!=i&&st[b]!=1)
b=next(b);
}
else{
if(st[a]<1)
a=i;
while(b!=i&&st[b]<1)
b=next(b);
}
while(k!=p[i].end()&&(*k=='D'||*k=='J'||*k=='P'&&hp[i]==4||*k=='K'&&(a==i||y&&!z[i])||*k=='F'&&b==i))
++k;
if(k==p[i].end())
break;
if(*k=='P')++hp[i];
if(*k=='K'&&(!y++||z[i]))
attack(i,a,k);
if(*k=='F')
attack(i,b,k);
if(*k=='N'||*k=='W'){
int j=i;
while((j=next(j))!=i)
if(!query(i,j)&&!find(j,*k=='N'?'K':'D')){
kill(i,j,k);
!j&&!~st[i]?st[i]=2:0;
}
}
if(*k=='Z')z[i]=1;
p[i].erase(k++);
}
}
}

BZOJ1972: [Sdoi2010]猪国杀的更多相关文章

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

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

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

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

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

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

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

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

  5. BZOJ1972:[SDOI2010]猪国杀

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

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

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

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

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

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

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

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

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

随机推荐

  1. matlab 画图中线型及颜色设置

    matlab受到控制界广泛接受的一个重要原因是因为它提供了方便的绘图 功能.本章主要介绍2维图形对象的生成函数及图形控制函数的使用方 法,还将 简单地介绍一些图形的修饰与标注函数及操作和控制MATLA ...

  2. Who Says What to Whom on Twitter-www2011-20160512

    分析性论文 what: who? 本文将Twitter中的用户分为了两大类--普通用户和精英用户,精英用户又被分为四类,分别为媒体(media).名人(celebrities).博主(bloggers ...

  3. java 环境配置

    ​'JAVAC' 不是内部或外部命令解决方法 'JAVAC' 不是内部或外部命令,也不是可运行的程序 或批处理文件. 'JAVA' 不是内部或外部命令,也不是可运行的程序 或批处理文件解决办法相似. ...

  4. IOS_SearchBar搜索栏及关键字高亮

    搜索框的效果演示: 这个就是所谓的搜索框了,那么接下来我们看看如何使用代码来实现这个功能. 我所使用的数据是英雄联盟的英雄名单,是一个JSON数据的txt文件, JSON数据的处理代码如下所示: ? ...

  5. 解决"415 Cannot process the message because the content type 'application/x-www-form-urlencoded' was not the expected type 'text/xml; charset=utf-8'"

    wcf basicHttpBinding content-type    text/xml;charset=utf-8 wsHttpBinding  'application/soap+xml; ch ...

  6. SharePoint 站点集和子站点数据互相读取

    1.站点集中可以使用SPSite.AllWeb,然后遍历所有站点的isRootWeb,根据siteTemplate取得需要的子站点. /// <summary> /// Handles t ...

  7. lineNumber: 1; columnNumber: 1; 前言中不允许有内容

    周六项目还能运行,也没修改什么,周一来了启动项目,竟然报错了~~~ 这是遇到的错误提示: Cause: org.xml.sax.SAXParseException; lineNumber: 1; co ...

  8. Maven遇到的错误汇总

    使用工具是MyEclipse10: 1.创建Maven项目出错 1.项目名带有Maven Webapp 解决方案: 2.缺少jar could not resolve archetype :   Co ...

  9. 【BZOJ 2693】jzptab

    莫名其妙地又卡在long long上了,我果然又在同一个地方犯逗. 在“在路上,同梦行”群里闹了个大笑话QAQ #include<cstdio> #include<cstring&g ...

  10. C#-WinForm-客户端程序-Form基本属性

    WinForm - 客服端程序(C/S) WindowsForm 的简称 客户端应用程序:是需要安装在用户电脑上才可以使用的程序,代码部分在用户电脑上执行 特点:不需要联网也可以打开使用部分功能,但现 ...