bzoj1972 SDOI2010-----猪国杀(模拟)
题目自己去找吧
记得数据范围是<=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-----猪国杀(模拟)的更多相关文章
- BZOJ1972:[SDOI2010]猪国杀(模拟)
Description 太长就不贴过来了 Solution 这个题是真的不难写……唯一的难度就在于理解题意上面……感觉这就是个阅读理解题啊…… 而且你三国杀玩的越多可能就越难写因为你无法理解那些猪的思 ...
- Luogu2482 [SDOI2010]猪国杀 ---- 模拟
Luogu2482 [SDOI2010]猪国杀 题意 ...... https://www.luogu.org/problemnew/show/P2482 总结 首先说一下代码的构思: 首先确定了所有 ...
- Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...
- BZOJ1972: [Sdoi2010]猪国杀
“此题注意样例少了个J,且牌堆可能用完牌,若牌用完则不停取最后一张”.——hzwer 然后直接模拟,认真读题,理清思路. #include<cstdio> #include<list ...
- [BZOJ 1972][Sdoi2010]猪国杀
1972: [Sdoi2010]猪国杀 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 364 Solved: 204[Submit][Status][D ...
- 【BZOJ1972】[SDOI2010] 猪国杀(恶心的大模拟)
点此看题面 大致题意: 让你模拟一个游戏猪国杀的过程. 几大坑点 对于这种模拟题,具体思路就不讲了,就说说有哪些坑点. 题面有锅,反猪是\(FP\). 数据有锅,牌堆中的牌可能不够用,牌堆为空之后需一 ...
- 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】
好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ...
- BZOJ1972:[SDOI2010]猪国杀
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- [洛谷P2482][SDOI2010]猪国杀
题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...
- 洛谷P2482 [SDOI2010]猪国杀——题解
猪国杀,模拟题的一颗耀眼的明珠,成长大牛.锻炼码力必写题! 模拟题没什么思维难度.只要按部就班地去做就是.模拟简单在这,难也在这.因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输.故推荐考试时碰见了, ...
随机推荐
- RabitMq过期时间TTL
第一种:给消息设置过期时间 启动一个插件 @Bean public DirectExchange DirectExchange() { return new DirectExchange(" ...
- mysql批量新增的语法
?useUnicode=true//语序编码反射光hi &characterEncoding=UTF-8//字符 &autoReconnect=true//自动连接 &useA ...
- java 后台解密小程序前端传过来的信息,解密手机号
package com.llny.controller; import com.google.gson.Gson; import com.google.gson.JsonObject; import ...
- SSD算法原理
Paper: https://arxiv.org/pdf/1512.02325.pdf SSD用神经网络(VGG)提取多层feature map ,来实现对不同大小物体的检测.如下图所示: We us ...
- Python3-sqlalchemy-orm 创建多表关联表带外键
#-*-coding:utf-8-*- #__author__ = "logan.xu" import sqlalchemy from sqlalchemy import crea ...
- css 文字超出俩行省略号显示
.center-titles{ overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: ...
- rtsp->rtmp 推流直播 Plan B
上篇文章我们谈到使用 EasyDarwin 推流后 前端HTML播放器 播放无画面的情况,找了各种播放器都服务正常解决,但使用VLC却能正常播放的问题,我们尝试了很久最后另辟蹊径,找到 nginx安装 ...
- DHCP 协议及其交互过程
1. DHCP用途简介: DHCP服务应用于大型局域网络中,使网络中的主机自动获取IP地址,网关,DNS服务器等信息,能够提升IP地址的利用率.一般情况下,我们的家用.公司.公共场合使用的路由器都具有 ...
- oracle table()函数
PL/SQL表---table()函数用法/* PL/SQL表---table()函数用法:利用table()函数,我们可以将PL/SQL返回的结果集代替table. oracle内存表在查询和报表的 ...
- git tag标签
列出标签 # 默认按字母排序显示 $ git tag # 模糊匹配查找标签 $ git tag -l "v2.8.5*" 创建标签 # 创建附注标签 $ git tag -a v1 ...