“此题注意样例少了个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. [HDOJ5442]Favorite Donut(最大表示法)

    嗯……就是最小表示法改一下…… 这题就是把S串当作两个判断同构的串,然后就搞出最大的表示了 然后在反向再做一次 O(n)求最大表示,O(n)判断正反谁大

  2. 东大OJ-麦森数

    1064: 麦森数 时间限制: 1 Sec  内存限制: 128 MB 提交: 52  解决: 9 [提交][状态][讨论版] 题目描述 形如2P-1的素数称为麦森数,这时P一定也是个素数.但反过来不 ...

  3. ecshop 签名

    先从index.php主页开始 页面关键字 {$keywords } 页面标题 {$page_title} 产品分类 父分类列表 {foreach from=$categories item=cat ...

  4. Beta版本冲刺Day6

    会议讨论: 628:配置Mysql的时候遇到了问题,在修改数据库用户密码时无法修改,并且服务器好像连接不上去了,其他组员则继续他们的任务.601:将一些原来的界面进行了修改,修改成了更加美观的外形. ...

  5. 1018Mysql分表分库

    单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 单库多表 随着用户数量的增加,user表的数据量会越来越大,当数 ...

  6. Android性能优化文章转载

    今天看到几篇比较好的文章就转了!(链接如下) 转载注明出处:Sunzxyong Android性能优化之Bitmap的内存优化 Android性能优化之常见的内存泄漏 Android最佳实践之Syst ...

  7. Redis集群(一):基本概念

    一.使用版本:3.0.0.0 二.基本概念:  号至 11000 号的哈希槽, 这样集群就不会因为主节点 B 的下线而无法正常运作了. 异步复制(虽然是异步复制,但是执行写命令和复制命令到从节点几乎是 ...

  8. Maven2-profile多环境配置

    使用maven管理项目有一个好处是就是可以针对不同的环境使用不同的编译打包设置,方便了多环境下的打包部署,一般我们开发项目都会有至少开发环境和正式环境两个,针对这两个环境的配置信息也会有所不同,比如数 ...

  9. [Linux.NET] CentOS 开启/关闭端口

    最近一直在学习研究mvc网站部署到Linux上,Web服务器用的Jexus,linux版本是阿里云提供的centos.一个服务器又要放多个独立网站,对于学习阶段使用多个端口标识还是挺方便的,本文记录下 ...

  10. GCD详解

    什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...