BZOJ1972: [Sdoi2010]猪国杀
“此题注意样例少了个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]猪国杀的更多相关文章
- Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...
- BZOJ1972:[SDOI2010]猪国杀(模拟)
Description 太长就不贴过来了 Solution 这个题是真的不难写……唯一的难度就在于理解题意上面……感觉这就是个阅读理解题啊…… 而且你三国杀玩的越多可能就越难写因为你无法理解那些猪的思 ...
- Luogu2482 [SDOI2010]猪国杀 ---- 模拟
Luogu2482 [SDOI2010]猪国杀 题意 ...... https://www.luogu.org/problemnew/show/P2482 总结 首先说一下代码的构思: 首先确定了所有 ...
- [BZOJ 1972][Sdoi2010]猪国杀
1972: [Sdoi2010]猪国杀 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 364 Solved: 204[Submit][Status][D ...
- BZOJ1972:[SDOI2010]猪国杀
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- 【BZOJ1972】[SDOI2010] 猪国杀(恶心的大模拟)
点此看题面 大致题意: 让你模拟一个游戏猪国杀的过程. 几大坑点 对于这种模拟题,具体思路就不讲了,就说说有哪些坑点. 题面有锅,反猪是\(FP\). 数据有锅,牌堆中的牌可能不够用,牌堆为空之后需一 ...
- 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】
好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ...
- [洛谷P2482][SDOI2010]猪国杀
题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...
- 洛谷P2482 [SDOI2010]猪国杀——题解
猪国杀,模拟题的一颗耀眼的明珠,成长大牛.锻炼码力必写题! 模拟题没什么思维难度.只要按部就班地去做就是.模拟简单在这,难也在这.因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输.故推荐考试时碰见了, ...
随机推荐
- winddows 运行指令 (2)
cmd.exe--------CMD命令提示符 chkdsk.exe-----Chkdsk磁盘检查 certmgr.msc----证书管理实用程序 calc-----------启动计算器 charm ...
- Bootstrap中glyphicons-halflings-regular.woff字体报404错notfound
今天查看网站的源代码,发现有个glyphicons-halflings-regular.woff文件没有找到,因为我的网站使用了bootstrap的Glyphicons 字体图标,因此需要加载Glyp ...
- MinHash算法
MinHash是用于快速检测两个集合的相似性的方法.改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法.它同样可以用于推荐系统和大规模文档 ...
- php 解析json
今天做项目的时候需要用到json数组,解析时遇到了个小小的麻烦,特此将解决办法记下: json数据如下: { "code":200, "message":&qu ...
- python环境搭建-pycharm2016软件注册码
pycharm软件下载地址 https://www.jetbrains.com/pycharm/ 方法一: pycharm 2016 注册码 43B4A73YYJ-eyJsaWNlbnNlSWQiOi ...
- Yii2初级入门教程
下载安装 Yii挺火的,也是MVC的Web框架.国内占有率,相当不错.值得一学. 网络上提供了两个版本模板的下载, advanced, 和 basic, 使用起来一致, 提供的模块支持不同. Adva ...
- 【转】JSP中文乱码问题终极解决方案
原文地址:http://blog.csdn.net/beijiguangyong/article/details/7414247 在介绍方法之前我们首先应该清楚具体的问题有哪些,笔者在本博客当中论述的 ...
- iOS开发--音乐文件播放工具类的封装(包含了音效的封装)
一.头文件 #import <Foundation/Foundation.h> #import <AVFoundation/AVFoundation.h> @interface ...
- iOS开发中的错误整理,pod文件Install失败
一.之前用黑苹果,编辑pod文件用一下格式 platform :ios, "8.0" pod "MJExtension" pod "MJRefresh ...
- Apache启动提示 httpd: apr_sockaddr_info_get() failed for xxx
httpd: apr_sockaddr_info_get() failed for xxx httpd: Could not reliably determine the server's fully ...