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]猪国杀——题解
猪国杀,模拟题的一颗耀眼的明珠,成长大牛.锻炼码力必写题! 模拟题没什么思维难度.只要按部就班地去做就是.模拟简单在这,难也在这.因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输.故推荐考试时碰见了, ...
随机推荐
-
相克军_Oracle体系_随堂笔记006-日志原理
简单来说,学习Oracle数据库就两个目标: 保证数据库数据的一致性: 提高数据库的性能(这个和日志没关系). 日志的功能: 只是保证数据库数据的一致性: 1.Oracle日志原理 ...
-
winserver2008 management note
1,磁盘online及介质保护 Windows server 2008 增加的磁盘无法初始化-提示:介质受写入保护.插了下相关说明,在VMware的帖子找到了解决办法: 开始-运行,cmd.打开命令提 ...
-
C# Tostring格式
开发中经常用到格式化,不管是时间.货币.数字都可以随心所欲.也许你用的是{0:C}方式,也许你用String.Format方式,也许你用.ToString("n"),都是格式化的方 ...
-
获取表单选中的值(利用php和js两种方式)
php代码中获取表单中单选按钮的值: (单选按钮只能让我们选择一个,这里有一个“checked”属性,这是用来默认选取的,我们每次刷新我们的页面时就默认为这个值.) 例: <form name= ...
-
Windows系统中IIS 6.0+Tomcat服务器环境的整合配置过程
IIS6.0+Tomcat整合 1.首先准备工作 Windows IIS 6.0 apache-tomcat-7.0.26.exe tomcat-connectors-1.2.33-windows-i ...
-
IoC容器Autofac正篇之简单实例
先上一段代码. namespace ConsoleApplication3 { class Program { static void Main(string[] args) { ContainerB ...
-
DFS和BFS(无向图)Java实现
package practice; import java.util.Iterator; import java.util.Stack; import edu.princeton.cs.algs4.* ...
-
201621123031 《Java程序设计》第10周学习总结
作业10-异常 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 1.捕捉异常 Java中的异常捕获结构由try.catch和finally三个部分组成.其中try语句 ...
-
必须知道的Linux内核常识详解
一.内核功能.内核发行版 1.到底什么是操作系统 (1)linux.windows.android.ucos就是操作系统: (2)操作系统本质上是一个程序,由很多个源文件构成,需要编译连接成操作系统程 ...
-
【libreOJ模板】并查集(输入挂,取模与find优化)
1.了解了各种输入挂性orz,找到了一个合适的 2.find用while写能快一倍,并且能被数据卡掉 3.取模只能快十几毫秒,但也能被数据卡掉 取模find双优化是1997mm过的 再加一个性价比较高 ...