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. C#中的分部类和分部方法:partial

    这篇文章主要介绍了C#中的分部类和分部方法,讲解了类的拆分和方法的定义的拆分,需要的朋友可以参考下可以将类或结构.接口或方法的定义拆分到两个或多个源文件中.每个源文件包含类型或方法定义的一部分,编译应 ...

  2. mongodb在w10安装及配置

    官网网站下载mongodb 第一步:安装 默认安装一直next,直到choose setup type,系统盘空间足够大,安装在c盘就好 第二步:配置及使用 1.创建目录mongodb,及三个文件夹d ...

  3. 【10】Quartz.net 定时服务实例

    一.安装nuget包 Install-Package Quartz Install-Package Common.Logging.Log4Net1211 Install-Package log4net ...

  4. [javaSE] 基本数据类型对象包装类

    按照java面向对象的原则,每个基本类型都有对应的包装类 byte Byte short Short int Integer long Long boolean Boolean float Float ...

  5. Web Service与Apache CXF 框架

    一.WebService简介 为了支持跨网络的机器间相互操作交互而设计,用于开发分布式的互操作的应用程序组件. Web Service服务通常被定义为一组模块化的API,它们可以通过网络进行调用,来执 ...

  6. C#学习笔记-中英文切换(XML)

    这几天因为软件需要加英文版本,所以查了好久的资料找到了相关的信息,原资料参考:http://blog.csdn.net/softimite_zifeng 上网查的中英文切换大约有两种方式:1.动态加载 ...

  7. 如何在vscode里面调试js和node.js

    一般大家调试都是在浏览器端调试js的,不过有些时候也想和后台一样在代码工具里面调试js或者node.js,下面介绍下怎样在vscode里面走断点. 1,用来调试js 一:在左侧扩展中搜索Debugge ...

  8. apply的妙用

    有一个很常见的问题"call和apply的区别是什么?",大家都知道答案:它们的区别仅在于接受参数的方式不同,传递给call的第二个参数必须逐个列举出来,而传递给apply的第二个 ...

  9. 50+ Useful Docker Tools

    As containers take root, dozens of tools have sprung up to support them. Check out your options for ...

  10. android studio 3.0 以上 查看sharedpreference

    android studio 3.0 以上 查看sharedpreference 点击android studio 右侧的device file explore,找到data / data 目录: 找 ...