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. Spring 学习(五)--- 事务(未完成)

    问题 : Spring 事务传播机制是怎么样的,在什么应用场景使用 事务是什么 我们使用的框架可能是Hibernate/JPA或者是Mybatis,都知道的底层是需要一个session/connect ...

  2. [javaSE] GUI(打开文件对话框)

    使用FileDialog可以打开文件对话框,根据模式不同,可以分为打开文件和保存文件对话框 获取FileDialog对象,new出来,参数:所属Frame对象,String的标题,FileDialog ...

  3. JDBC入门(4)--- 批处理

    1.Statement批处理 当你有10条SQL语句要执行时,一次向服务器发送一条SQL语句,这样做的效率上极差,处理的方案是使用批处理,即一次向服务发送多条SQL语句,然后由服务器一次性处理. 批处 ...

  4. BZOJ1266 [AHOI2006]上学路线

    Description 可可和卡卡家住合肥市的东郊,每天上学他们都要转车多次才能到达市区西端的学校.直到有一天他们两人参加了学校的信息学奥林匹克竞赛小组才发现每天上学的乘车路线不一定是最优的. 可可: ...

  5. JDBC中常用对象介绍

    JDBC中的主要类(接口) 在JDBC中常用的类有: 1.DriverManager 2.Connection 3.Statement 4.ResultSet 1.DriverManager 其实我们 ...

  6. LintCode2016年8月22日算法比赛----将数组重新排序以构造最小值

    将数组重新排序以构造最小值 题目描述 给定一个整数数组,请将其重新排序,以构造最小值. 样例 给定[3,32,321],通过将数组重新排序,可构造6个可能性的数字: 3+32+321=332321 3 ...

  7. Django最佳实践(中文版)

    这是一份关于开发和部署 Django Web 框架 的动态文档 (会随时更新). 这些准则不应该被认为是 绝对正确 或 唯一 使用 Django 的方法, 应该说这些最佳实践是我们使用框架多年来积累的 ...

  8. 读<css世界>笔记之img标签

    Web开发时,为了节约带宽以及提高加载性能,首屏以下的图片就会通过滚屏加载的方式异步加载,然后这个即将被异步加载的图片为了布局稳健,体验良好,往往会使用一张透明的图片占位,如: <img src ...

  9. GIT:如何管理本机的多个ssh密钥(多个远程仓库账号)

    最近在学习git,首先推荐一个个人认为很不错的git教程,学习后,从git新手变成了git入门了,仍需继续努力. 廖老师的git学习教程(其他git基础知识点,本篇博客就不做介绍了,自己看教程学习吧, ...

  10. linux 下的python的最佳打开方式, you know?

    IPython install IPython是Python的交互式Shell,提供了代码自动补完,自动缩进,高亮显示,执行Shell命令等非常有用的特性.特别是它的代码补完功能,例如:在输入zlib ...