“此题注意样例少了个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. 将IList转换为List

     简单点说,IList<T>直接转换为List<T>可以不用考虑.IList<T>可以用至少2种方式简单的复制成List<T>:1.IList<T ...

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

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

  3. js中各种宽度高度总结

    offsetWidth 是对象的可见宽度,包滚动条等边线,会随窗口的显示大小改变 IE6.0.FF1.06+:offsetWidth = width + padding + borderoffsetH ...

  4. 数据结构——动态链表(C++)

    定义一个节点: [cpp] view plain copy   print? #include <iostream> using namespace std; typedef int T; ...

  5. Linux开机后 systemd 自动启动 ceph osd mon进程

    机房操作失误导致机架或主机掉电是偶尔发生的事情,那么怎么在这种情况下,让Ceph服务随OS启动而快速启动呢 ? 如下是一个简单方法: 在OSD主机上执行如下命令: sudo ln -s /usr/li ...

  6. 开发错误记录2 .MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed!

    刚在调试android程序报 导致直接崩了 .MainActivity (server)' ~ Channel is unrecoverably broken and will be disposed ...

  7. iOS不得姐项目--图片帖子模块,大图默认显示最顶部分的处理

    一.刚开始的处理,设置Mode属性(self.pictureImageView.contentMode = UIViewContentModeScaleAspectFill;) 和 Clip Subv ...

  8. 【51NOD 1478】括号序列的最长合法子段

    很恶心啊,一道水题改了半天,主要是各种细节没有注意到,包括左括号剩余时有可能会出错的情况,需要从后往前扫 贡献一组测试数据: ((()))())(())(( 答案:8 1 #include<cs ...

  9. Java 学习之路 之 泛型方法

    前面介绍了在定义类.接口时可以使用类型形参,在该类的方法定义和 Field 定义.接口的方法定义中,这些类型形参可被当成普通类型来用.在另外一些情况下,我们定义类.接口时没有使用类型形参,但定义方法时 ...

  10. 【Gym 100947C】Rotate It !!

    分两类,奇数和偶数的,用隔项前缀和算一下. #include <algorithm> #include <iostream> #define N 10005 using nam ...