BZOJ1972:[SDOI2010]猪国杀(模拟)
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]猪国杀(模拟)的更多相关文章
- 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]猪国杀——题解
猪国杀,模拟题的一颗耀眼的明珠,成长大牛.锻炼码力必写题! 模拟题没什么思维难度.只要按部就班地去做就是.模拟简单在这,难也在这.因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输.故推荐考试时碰见了, ...
随机推荐
- C#中的分部类和分部方法:partial
这篇文章主要介绍了C#中的分部类和分部方法,讲解了类的拆分和方法的定义的拆分,需要的朋友可以参考下可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应 ...
- mongodb在w10安装及配置
官网网站下载mongodb 第一步:安装 默认安装一直next,直到choose setup type,系统盘空间足够大,安装在c盘就好 第二步:配置及使用 1.创建目录mongodb,及三个文件夹d ...
- 【10】Quartz.net 定时服务实例
一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...
- [javaSE] 基本数据类型对象包装类
按照java面向对象的原则,每个基本类型都有对应的包装类 byte Byte short Short int Integer long Long boolean Boolean float Float ...
- Web Service与Apache CXF 框架
一.WebService简介 为了支持跨网络的机器间相互操作交互而设计,用于开发分布式的互操作的应用程序组件. Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执 ...
- C#学习笔记-中英文切换(XML)
这几天因为软件需要加英文版本,所以查了好久的资料找到了相关的信息,原资料参考:http://blog.csdn.net/softimite_zifeng 上网查的中英文切换大约有两种方式:1.动态加载 ...
- 如何在vscode里面调试js和node.js
一般大家调试都是在浏览器端调试js的,不过有些时候也想和后台一样在代码工具里面调试js或者node.js,下面介绍下怎样在vscode里面走断点. 1,用来调试js 一:在左侧扩展中搜索Debugge ...
- apply的妙用
有一个很常见的问题"call和apply的区别是什么?",大家都知道答案:它们的区别仅在于接受参数的方式不同,传递给call的第二个参数必须逐个列举出来,而传递给apply的第二个 ...
- 50+ Useful Docker Tools
As containers take root, dozens of tools have sprung up to support them. Check out your options for ...
- android studio 3.0 以上 查看sharedpreference
android studio 3.0 以上 查看sharedpreference 点击android studio 右侧的device file explore,找到data / data 目录: 找 ...