Description

太长就不贴过来了

Solution

这个题是真的不难写……唯一的难度就在于理解题意上面……感觉这就是个阅读理解题啊……

而且你三国杀玩的越多可能就越难写因为你无法理解那些猪的思维……

Asia:这些猪会强制把你变得和他们一样sb,然后用他们丰富的sb经验来打败你

细节就不说了……说几个我写挂或者遗漏的点吧:

1、手牌不要从左扫到右扫完一遍就结束了……可能后面发生了什么事件导致你前面的牌又可以用了。

2、无懈可击的写法:我是不停的递归下去直到一方没有无懈可击为止 不知道有没有别的写法

3、牌堆没牌的话就不停摸牌堆最后一张,直到结束为止。这里好像题目里没有说……?

4、决斗无限距离且反贼只会直接去决斗刚主公

一些具体细节可以看代码实现……太多了就不说了……

Code

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#define N (15)
using namespace std; struct Pig
{
int hp;//血量
int id;//真实身份 123主忠反
int id2;//跳明身份 01是否跳明 2类反
int bow;//是否装有武器
vector<char>card;//可打出的手牌
}p[N];
queue<char>q;//牌堆
char opt[],a[],b[],c[],d[];
int n,m,Fnum,cpos; void debug(int x)
{
cout<<x<<':';
for (int i=; i<p[x].card.size(); ++i)
printf("%c ",p[x].card[i]);
puts("");
} void Print()
{
for (int i=; i<=n; ++i)
if (p[i].hp==) puts("DEAD");
else
{
for (int j=; j<p[i].card.size(); ++j)
printf("%c ",p[i].card[j]);
puts("");
}
exit();
} int Dis(int x,int y)//计算距离
{
int ans=;
for (int i=x%n+; i!=y; i=i%n+)
if (p[i].hp>) ans++;
return ans;
} void Solve(int from,int x,char opt,int cnt)//伤害来源,结算角色,需要的卡牌,需要的张数。
{
for (int i=; i<p[x].card.size();)
if (p[x].card[i]!=opt || cnt==) ++i;
else p[x].card.erase(p[x].card.begin()+i),cnt--;
if (cnt>)
{
p[x].hp--;
if (p[x].id== && !p[from].id2) p[from].id2=;
}
if (p[x].hp==)
{
for (int i=; i<p[x].card.size();)
if (p[x].card[i]!='P') ++i;
else
{
p[x].card.erase(p[x].card.begin()+i);
p[x].hp=; break;
}
if (p[x].hp!=) return;
cpos=;//有人死亡后手牌重新从最左开始扫
if (p[x].id==) Fnum--;
if (p[x].id==)
puts("FP"),Print();
if (!Fnum)
puts("MP"),Print(); if (p[x].id== && p[from].id==)
p[from].bow=, p[from].card.clear();
if (p[x].id==)
{
for (int i=; i<=; ++i)
{
p[from].card.push_back(q.front());
if (q.size()>) q.pop();
}
}
}
} bool check(int x,int y,int opt)//检查x对y是否合法,opt为将要进行的类型 1献殷勤2表敌意
{
if (p[x].hp== || p[y].hp==) return false;
int idx=p[x].id==?:;
int idy=p[y].id==?:;
if (idx!=idy && p[y].id2== && opt==) return true;
if (idx==idy && p[y].id2== && opt==) return true;
if (p[y].id2== && p[x].id== && opt==) return true;
return false;
} int WXKJ(int pos,int opt,int tar)//这一轮开始的位置,当前是否生效1生效2无效,目标
{
if (check(pos,tar,opt))
for (int i=; i<p[pos].card.size();++i)
if (p[pos].card[i]=='J')
{
if (p[pos].id2!=) p[pos].id2=,cpos=;
p[pos].card.erase(p[pos].card.begin()+i);
return WXKJ(pos,opt==?:,tar);
} for (int i=pos%n+; i!=pos; i=i%n+)
if (check(i,tar,opt))
for (int j=; j<p[i].card.size();++j)
if (p[i].card[j]=='J')
{
if (p[i].id2!=) p[i].id2=,cpos=;
p[i].card.erase(p[i].card.begin()+j);
return WXKJ(i,opt==?:,tar);
}
return opt;
} int main()
{
scanf("%d%d",&n,&m);
for (int i=; i<=n; ++i)
{
scanf("%s%s%s%s%s",opt,a,b,c,d);
if (opt[]=='M') p[i].id=,p[i].id2=;
if (opt[]=='Z') p[i].id=;
if (opt[]=='F') p[i].id=,Fnum++;
p[i].hp=;
p[i].card.push_back(a[]); p[i].card.push_back(b[]);
p[i].card.push_back(c[]); p[i].card.push_back(d[]);
}
for (int i=; i<=m; ++i)
scanf("%s",a),q.push(a[]);
if (!Fnum){puts("MP");Print();return ;} int now=;
while ()
{
bool kill=false;
p[now].card.push_back(q.front());
if (q.size()>) q.pop();
p[now].card.push_back(q.front());
if (q.size()>) q.pop();
// debug(now);
for (cpos=; cpos<p[now].card.size();)
{
if (p[now].hp==) break;
switch (p[now].card[cpos])
{
case 'P'://桃
{
if (p[now].hp<)
{
p[now].hp++;
p[now].card.erase(p[now].card.begin()+cpos);
}
else ++cpos;
break;
}
case 'K'://杀
{
if (kill && !p[now].bow){++cpos; break;}
bool vis=false;
for (int i=now%n+; i!=now; i=i%n+)
if (check(now,i,) && Dis(now,i)<=)
{
vis=true; kill=true;
p[now].card.erase(p[now].card.begin()+cpos);
Solve(now,i,'D',);
if (p[now].id2!=) p[now].id2=,cpos=;
break;
}
if (!vis) ++cpos;
break;
}
case 'F'://决斗
{
bool vis=false;
int tar=-;
if (p[now].id==) tar=;
else
for (int i=now%n+; i!=now; i=i%n+)
if (check(now,i,)){tar=i; break;}
if (tar==-){++cpos; break;} p[now].card.erase(p[now].card.begin()+cpos);
if (p[now].id2!=) p[now].id2=,cpos=;
if (WXKJ(now,,tar)==) break;
int cnt1=,cnt2=;
for (int k=; k<p[now].card.size(); ++k)
if (p[now].card[k]=='K') cnt1++;
for (int k=; k<p[tar].card.size(); ++k)
if (p[tar].card[k]=='K') cnt2++;
if (p[now].id== && p[tar].id==)
Solve(now,tar,'?',);
else
{
Solve(now,tar,'K',cnt1+);
Solve(tar,now,'K',cnt2);
}
break;
}
case 'N'://南蛮入侵
{
p[now].card.erase(p[now].card.begin()+cpos);
for (int i=now%n+; i!=now; i=i%n+)
{
if (p[i].hp==) continue;
if (WXKJ(now,,i)==) continue;
Solve(now,i,'K',);
}
break;
}
case 'W'://万箭齐发
{
p[now].card.erase(p[now].card.begin()+cpos);
for (int i=now%n+; i!=now; i=i%n+)
{
if (p[i].hp==) continue;
if (WXKJ(now,,i)==) continue;
Solve(now,i,'D',);
}
break;
}
case 'Z'://诸葛连弩
{
p[now].bow=;
p[now].card.erase(p[now].card.begin()+cpos);
cpos=; break;
}
default: ++cpos;
}
}
now=now%n+;
while (p[now].hp==) now=now%n+;
}
}

BZOJ1972:[SDOI2010]猪国杀(模拟)的更多相关文章

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

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

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

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

  3. BZOJ1972: [Sdoi2010]猪国杀

    “此题注意样例少了个J,且牌堆可能用完牌,若牌用完则不停取最后一张”.——hzwer 然后直接模拟,认真读题,理清思路. #include<cstdio> #include<list ...

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

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

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

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

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

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

  7. BZOJ1972:[SDOI2010]猪国杀

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

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

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

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

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

随机推荐

  1. String.IsNullOrEmpty 与 String.IsNullOrWhiteSpace

    String.IsNullOrEmpty 指示指定的字符串是否为 null 或者 空字符串: 返回值:如果参数为 null 或者 空字符串("" .String.Empty),结果 ...

  2. RabbitMQ---1、安装与部署

    一.下载资源 Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang.(在官网自行选择版本) 1.otp_win64_20.2.exe 下载地 ...

  3. 使用MUI框架,模拟手机端的下拉刷新,上拉加载操作。

    套用mui官方文档的一句话:“开发者只需关心业务逻辑,实现加载更多数据即可”.真的是不错的框架. 想更多的了解这个框架:http://dev.dcloud.net.cn/mui/ 那么如何实现下拉刷新 ...

  4. 二、hive shell常用命令

    在使用hive shell之前我们需要先安装hive,并启动hdfs 请参考:https://www.cnblogs.com/lay2017/p/9973298.html hive shell 我们先 ...

  5. 动态页面技术之JSP

    1.什么是JSP技术 JSP全名为Java Server Pages,中文名叫java服务器页面,其根本是一个简化的Servlet设计,它是由Sun Microsystems公司倡导.许多公司参与一起 ...

  6. Inter网关做Team的方法

    1.到Inter官网上找到相关驱动程序 2.在安装过程中,要求勾选高级网络 3.驱动安装完成后,打开网卡的属性窗口,在“分组”选项卡中,勾中,并输入Team名称 4.选择需要做Team的网卡 5.选择 ...

  7. DOM基础操作实战代码

    对于已经讲解给大家的DOM实战,我今天给大家几个实战代码,可以让大家加深对此的理解! 1.用DOM动态生成这样一个结构: <div class=”example”> <p class ...

  8. 关于修改bug的思考

     作者:朱金灿 来源:http://blog.csdn.net/clever101 有软件就有bug,这意味着软件研发不仅仅是新功能开发,更要拿出相当一部分精力去修改bug.但基本很多软件开发者并 ...

  9. System Monitor ArcGIS系统监控利器

    System Monitor是Esri推出的GIS系统监控工具,对于GIS数据中心的运维人员是难得的利器.早期版本是开源免费的解决方案,在今年的Esri 全球用户大会上,Esri宣布将发行商业版的Sy ...

  10. 微服务架构之spring cloud turbine

    在前面介绍了spring cloud hystrix及其hystrix dashboard,但都是对单个项目的监控,对于一个为项目而言,必定有很多微服务,一个一个去看非常的不方便,如果有一个能集中熔断 ...