洛谷P2482 [SDOI2010]猪国杀——题解
猪国杀,模拟题的一颗耀眼的明珠,成长大牛、锻炼码力必写题!
模拟题没什么思维难度。只要按部就班地去做就是。模拟简单在这,难也在这。因为题面巨长,条件巨多,忽疏一点都有可能全盘皆输。故推荐考试时碰见了,除非真的闲的没事,否则尽量不要碰。一旦陷入细节混乱的深渊,估计一上午/下午的考试就混过去了。
总结一下做题的注意点:
1、审题是最基本的!
做大模拟题时,必须要认真读题,可能的话,要把所有条件都列举出来(不然就会像我一样,调了一上午才发现就是忘了几个题目中提到的条件或要求)。
2、理清思路。
不要吝啬草稿纸,把框架、注意点都写出来。相信我,除非您是AKIOI/NOI/CSP很强的大佬,否则在敲了几百行代码后,肯定会忘了些什么的。而忘了的,都会成为事后艰难调试的根源之一。
同时,写代码时推荐多利用自定义函数,变量名尽量都用自己熟悉的、见名知意的。这样不仅使程序层次清晰、易于理解,还方便后期的调试(不然写了500行代码后再回来看a1,a2..什么的自己都不知道意义的变量,想死的心都有了)
3、对于本题来说,找准对象、明确不同对象之间行为的差别也是很有必要的。这种细节特别容易忘,而找起来不留意的话也很难找。
接下来说一下我犯过的容易掉的坑吧,注意一下,这也算是这片题解的主体(没准您就掉进这些坑中呢?):
1、杀死反猪后会摸牌,要注意猪能否再出牌
2、 反猪决斗优先打主公(读题)
3、决斗可能会自杀
4、决斗只能在第一个人出杀前被无懈可击掉
5、要注意用牌的顺序(从左到右),以便输出
6、杀、决斗、无懈可击都会标明身份,南猪入侵和万箭齐发顶多在未表明身份时被主猪认为类反贼
7、决斗时,主公认为对面是类反贼,实际上是忠臣的情况下,忠臣要牺牲一滴血(连无懈可击也不能出)
8、当自己没表明身份时,不能对自己用无懈可击
9、牌能用,要先把用牌的标记打上,免得主杀忠弃牌后再打标记导致错误
10、装上猪哥连弩有可能使前面的杀能用
11、中途有新的猪表明身份后,也有可能能让前面的决斗或杀能用。
12、要每次都用最左边的能用的牌,是对全体来说,而不是对某种来说!
13、“无懈可击:在目标锦囊生效前抵消其效果。每次有一张锦囊即将生效时,从使用这张锦囊的猪开始,按照逆时针顺序,依次得到使用无懈可击的机会”。这一点与三国杀不同,三国杀是从锦囊牌的对象开始的。但这里是猪国杀
14、for循环后i会+1,如重新从左到右看牌,i不能取1,要取0。
15、当牌堆没有牌时,会一直摸最后一张牌。(这就是RE点的原因吧)
#include<iostream>
#include<cstdio>
#include<cstring> using namespace std; const int N=,M=; int n,m,win,top,fan,usesha,liangshengfen; char ch,pai; bool vis[N][M],allsf[N]; struct PIG{
int liv,rit,tot,iden,leifan,biao,zhuge,xie;
int wuxie,sha,shan,tao;
char card[M+];
int used[M+];
}pig[N]; char Card[M],sf[]; inline char readch()
{
ch=getchar();
while(ch<'A'||ch>'Z')
ch=getchar();
return ch;
} inline void init()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)
{
pig[i].liv=;pig[i].xie=;
scanf("%s",sf);
switch(sf[])
{
case 'M':pig[i].iden=;pig[i].biao=;break;
case 'Z':pig[i].iden=;break;
default:
fan++;
}
for(int j=;j<=;++j)
{
pai=readch();
switch(pai)
{
case 'J':
pig[i].wuxie++;break;
case 'K':
pig[i].sha++;break;
case 'D':
pig[i].shan++;break;
case 'P':
pig[i].tao++;break; }
pig[i].tot++;
pig[i].card[++pig[i].rit]=pai;
} }
for(int i=;i<=m;++i)
Card[i]=readch();
top=;
} inline void yongtao(int u)
{
for(int i=;i<=pig[u].rit;++i)
if(!pig[u].used[i]&&pig[u].card[i]=='P')
{
pig[u].used[i]=;
return;
}
} inline void yonggewuxie(int u)
{
for(int i=;i<=pig[u].rit;++i)
if(!pig[u].used[i]&&pig[u].card[i]=='J')
{
pig[u].used[i]=;
return;
}
} inline void yongsha(int u,int ge)
{
if(!ge)
return;
for(int i=;i<=pig[u].rit;++i)
if(!pig[u].used[i]&&pig[u].card[i]=='K')
{
pig[u].used[i]=;
ge--;
if(!ge)
return;
}
} inline void yongshan(int u)
{
for(int i=;i<=pig[u].rit;++i)
if(!pig[u].used[i]&&pig[u].card[i]=='D')
{
pig[u].used[i]=;
return;
}
} int yongwuxie(int u,int good,int sta)//表身份
{
if(pig[u].biao==)
{
if(pig[u].leifan==)
{
if(good) return ;
if(pig[].wuxie)
{
pig[].wuxie--;
pig[].tot--;
yonggewuxie();
if(!yongwuxie(,,)) return ;
else return ;
}
}
else
return ;
}
int k=n,now=sta-;
if(good)
{
while(k--)
{
now++;
if(now>n)
now=;
if(!pig[now].liv) continue;
if((pig[now].iden&)==(pig[u].iden&)&&pig[now].wuxie)
{
pig[now].wuxie--;
pig[now].tot--;
yonggewuxie(now);
if(pig[now].biao==)
pig[now].biao=,liangshengfen=;
if(!yongwuxie(now,,now)) return ;
else return ;
}
}
return ;
}
else
{
while(k--)
{
now++;
if(now>n)
now=;
if(!pig[now].liv) continue;
if((pig[now].iden&)!=(pig[u].iden&)&&pig[now].wuxie)
{
pig[now].wuxie--;
pig[now].tot--;
yonggewuxie(now);
if(pig[now].biao==)
pig[now].biao=,liangshengfen=;
if(!yongwuxie(now,,now)) return ;
else return ;
}
}
return ;
}
} inline void mosanzhang(int u)
{
for(int j=;j<=;++j)
{
pai=Card[top++];
if(top>m) top=m;
switch(pai)
{
case 'J':
pig[u].wuxie++;break;
case 'K':
pig[u].sha++;break;
case 'D':
pig[u].shan++;break;
case 'P':
pig[u].tao++;break;
}
pig[u].tot++;
pig[u].card[++pig[u].rit]=pai;
}
} inline void diaoxie(int u,int now)//u使now掉血,处理死亡(不处理仇恨)
{
pig[now].xie--;
if(pig[now].xie==)
{
if(pig[now].tao)
{
pig[now].xie=;
pig[now].tot--;
pig[now].tao--;
yongtao(now);
}
else
{
pig[now].liv=;
if(pig[now].iden==)
{
win=;
return;
}
if(pig[now].iden==)
{
if(pig[u].iden==)
{
pig[u].zhuge=;
pig[u].tao=pig[u].sha=pig[u].shan=pig[u].wuxie=;
for(int i=;i<=pig[u].rit;++i)
pig[u].used[i]=;
pig[u].rit=pig[u].tot=;
return;
}
}
if(pig[now].iden==)
{
fan--;
if(fan==)
{
win=;
return;
}
mosanzhang(u);
}
}
}
} inline void nanman(int u)//无仇恨,只类反
{
int k=n-,now=u;
while(k--)
{
now++;
if(now>n) now=;
if(!pig[now].liv) continue;
if(!yongwuxie(now,,u))
{
if(pig[now].sha>)
{
pig[now].sha--;
pig[now].tot--;
yongsha(now,);
}
else
{
diaoxie(u,now);
if(pig[now].iden==&&pig[u].biao==)
pig[u].leifan=;
}
}
if(win) return;
}
} inline void wanjian(int u)
{
int k=n-,now=u;
while(k--)
{
now++;
if(now>n)
now=;
if(!pig[now].liv) continue;
if(!yongwuxie(now,,u))
{
if(pig[now].shan>)
{
pig[now].shan--;
pig[now].tot--;
yongshan(now);
}
else
{
diaoxie(u,now);
if(pig[now].iden==&&pig[u].biao==)
pig[u].leifan=;
}
}
if(win) return;
}
} inline int doumubiao(int u)
{
if(!pig[u].iden)
return ;
int now=u,k=n-;
while(k--)
{
now++;
if(now>n)
now=;
if(!pig[now].liv)
continue;
if(pig[now].biao==)
{
if(u==&&pig[now].leifan)
return now;
}
else
{
if((pig[now].iden&)!=(pig[u].iden&))
return now;
}
}
return ;
} inline int juedou(int u,int now)//只计算掉血、杀
{
if(u==&&pig[now].iden)
{
diaoxie(,now);
return ;
}
if(yongwuxie(now,,u))
return ;
if(!pig[now].sha)
{
diaoxie(u,now);
return ;
}
pig[now].sha--;
pig[now].tot--;
yongsha(now,);
// if(yongwuxie(u,1))
// return 0;
if(!pig[u].sha)
{
diaoxie(now,u);
return ;
}
pig[u].sha--;
pig[u].tot--;
yongsha(u,);
if(pig[now].sha>pig[u].sha)
{
pig[now].sha-=pig[u].sha+;
pig[now].tot-=pig[u].sha+;
yongsha(now,pig[u].sha+);
yongsha(u,pig[u].sha);
pig[u].tot-=pig[u].sha;
pig[u].sha=;
diaoxie(now,u);
return ;
}
else
{
pig[u].sha-=pig[now].sha;
pig[u].tot-=pig[now].sha;
yongsha(u,pig[now].sha);
yongsha(now,pig[now].sha);
pig[now].tot-=pig[now].sha;
pig[now].sha=;
diaoxie(u,now);
return ;
}
} inline void zhengli(int u)
{
int ccnt=;
for(int i=;i<=pig[u].rit;++i)
{
if(!pig[u].used[i])
pig[u].card[++ccnt]=pig[u].card[i];
else
pig[u].used[i]=;
}
pig[u].rit=ccnt;
} inline int nengyongsha(int u)
{
int k=n-,now=u;
while(k--)
{
now++;
if(now>n) now=;
if(!pig[now].liv) continue;
if(pig[u].iden==)
{
if(pig[now].biao==)
{
if(pig[now].iden==)
return now;
else
return ;
}
else
if(pig[now].leifan)
return now;
else
return ;
}
if(pig[now].biao==)
return ;
if((pig[now].iden&)!=(pig[u].iden&))
return now;
else
return ;
}
return ;
} inline void chupai(int u)
{
int t;
int weiyongdou=,weiyongsha=,weiyongtao=;
liangshengfen=;
usesha=;
for(int i=;i<=pig[u].rit;++i)
if(!pig[u].used[i])
{
switch(pig[u].card[i])
{
case 'N':
pig[u].tot--;
pig[u].used[i]=;
nanman(u);
break;
case 'F':
if(t=doumubiao(u))
{
pig[u].used[i]=;
pig[u].tot--;
pig[u].biao=;
if(juedou(u,t))//自己掉血
{
if(weiyongtao>)
{
yongtao(u);
pig[u].xie++;
pig[u].tao--;
pig[u].tot--;
weiyongtao--;
}
}
}
else
weiyongdou=;
break;
case 'W':
pig[u].tot--;
pig[u].used[i]=;
wanjian(u);
break;
case 'Z':
pig[u].zhuge=;
pig[u].used[i]=;
pig[u].tot--;
break;
case 'D':break;
case 'J':break;
case 'P':
if(pig[u].xie<)
{
pig[u].xie++;
pig[u].tao--;
pig[u].used[i]=;
}
else
weiyongtao++;
break;
case 'K':
if(!usesha||(pig[u].zhuge))
{
if(t=nengyongsha(u))
{
usesha=;
pig[u].biao=;
pig[u].used[i]=;
pig[u].tot--;
pig[u].sha--;
if(pig[t].shan)
{
pig[t].shan--;
yongshan(t);
pig[t].tot--;
}
else
diaoxie(u,t);
}
else
weiyongsha=;
}
else
weiyongsha=;
break;
}
if(!pig[u].liv)
return;
if(win) return;
if(liangshengfen&&weiyongdou)
{
liangshengfen=;weiyongdou=;
i=;
}
else
if(weiyongsha&&(!usesha||pig[u].zhuge)&&nengyongsha(u))
{
weiyongsha=;
i=;
}
}
if(pig[u].rit>(pig[u].tot<<))
zhengli(u);
} int main()
{
init();
int now=;
while(!win)
{
if(pig[now].liv)
{
for(int j=;j<=;++j)
{
pai=Card[top++];
if(top>m) top=m;
switch(pai)
{
case 'J':
pig[now].wuxie++;break;
case 'K':
pig[now].sha++;break;
case 'D':
pig[now].shan++;break;
case 'P':
pig[now].tao++;break;
}
pig[now].tot++;
pig[now].card[++pig[now].rit]=pai;
}
chupai(now);
}
now++;
if(now>n)
now=;
}
if(win==)
printf("MP\n");
else
printf("FP\n");
for(int i=;i<=n;++i)
{
if(!pig[i].liv)
printf("DEAD\n");
else
{
for(int j=;j<=pig[i].rit;++j)
if(!pig[i].used[j])
{
printf("%c ",pig[i].card[j]);
}
putchar('\n');
}
}
return ;
}
580行AC代码警告
洛谷P2482 [SDOI2010]猪国杀——题解的更多相关文章
- [洛谷P2482][SDOI2010]猪国杀
题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...
- 洛谷 P2482 loj #2885 [SDOI2010]猪国杀 题解【模拟】【贪心】【搜索】
好玩的模拟题. 以后要经常写模拟题鸭 题目描述 游戏背景 <猪国杀>是一种多猪牌类回合制游戏,一共有\(3\)种角色:主猪,忠猪,反猪.每局游戏主猪有且只有\(1\)只,忠猪和反猪可以有多 ...
- Bzoj1972: [Sdoi2010]猪国杀 题解(大模拟+耐心+细心)
猪国杀 - 可读版本 https://mubu.com/doc/2707815814591da4 题目可真长,读题都要一个小时. 这道题很多人都说不可做,耗时间,代码量大,于是,本着不做死就不会死的精 ...
- Luogu P2482 [SDOI2010]猪国杀
这道题在模拟界地位不亚于Luogu P4604 [WC2017]挑战在卡常界的地位了吧. 早上到机房开始写,中间因为有模拟赛一直到1点过才正式开始码. 一边膜拜CXR dalao一边写到3点左右,然后 ...
- 并不对劲的bzoj1972:loj2885:p2482[SDOI2010]猪国杀
题目大意 只能放链接了. 题目中有一点没说:并不是保证牌够用,而是在牌不够用时反复抽最后一张牌. 题解 发现玩家的数量比较少,所以可以不太在意时间够不够用. 考虑三件事:1.基本操作,如摸牌.出牌.玩 ...
- Luogu2482 [SDOI2010]猪国杀 ---- 模拟
Luogu2482 [SDOI2010]猪国杀 题意 ...... https://www.luogu.org/problemnew/show/P2482 总结 首先说一下代码的构思: 首先确定了所有 ...
- [BZOJ 1972][Sdoi2010]猪国杀
1972: [Sdoi2010]猪国杀 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 364 Solved: 204[Submit][Status][D ...
- BZOJ1972:[SDOI2010]猪国杀
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- 【BZOJ1972】[SDOI2010] 猪国杀(恶心的大模拟)
点此看题面 大致题意: 让你模拟一个游戏猪国杀的过程. 几大坑点 对于这种模拟题,具体思路就不讲了,就说说有哪些坑点. 题面有锅,反猪是\(FP\). 数据有锅,牌堆中的牌可能不够用,牌堆为空之后需一 ...
随机推荐
- [转帖]2017年新闻: 中国CPU还在“群雄割据” ,印度已确定了国家指令集
中国CPU还在“群雄割据” ,印度已确定了国家指令集 时间:2017-12-21 作者:观察者网 https://www.eet-china.com/news/201712210610.html ...
- 使用rsync在linux(服务端)与windows(客户端)之间同步
说明: 1.RsyncServer服务端 系统:CentOS 6.8 IP地址:192.168.247.141 2.Rsync客户端 系统:Windows10 实现目的: Rsync客户端同步服务端/ ...
- 小记---------有关hadoop的HDFS命令行操作
HDFS命令操作 首先需要在xshell启动hadoop start-all.sh or start-hdfs.sh hadoop fs -ls / (显示当前目录下所有文件) h ...
- Jinja2 中文手册
欢迎来到 Jinja2 Jinja2 是一个现代的,设计者友好的,仿照 Django 模板的 Python 模板语言. 它速度快,被广泛使用,并且提供了可选的沙箱模板执行环境保证安全: <tit ...
- MySQL数据表操作命令
mysql语句: 1.修改表名: rename table 旧表名 to 新表名; 2.修改字段类型: alter table 表名 modify column 字段名 字段类型(长度) 3.修改字段 ...
- 新版 Scrapy 中 sys.conf.settings 的替代方法
新版 Scrapy 中 sys.conf.settings 的替代方法 在 scrapy 项目目录下,有个 settings.py 文件,此文件是用来存放爬虫项目的各种配置,比如说 MongoDB 的 ...
- 083、Prometheus架构(2019-05-05 周日)
参考https://www.cnblogs.com/CloudMan6/p/7692765.html Prometheus 是一个非常优秀的监控工具,准确的说,应该是监控方案.Prometheus ...
- Linux设置远程免密登录
1.生成公钥 / 私钥对 [root@localhost ~]# ssh-keygen -t rsa -P '' -P表示密码,-P '' 就表示空密码,也可以不用-P参数,这样就要三车回车,用-P就 ...
- Java学习路线(完整详细版)
Java学习路线(完整详细版) https://jingyan.baidu.com/article/c1a3101e110864de656deb83.html
- poj 1915 KnightMoves(bfs)
Knight Moves Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 24094 Accepted: 11364 De ...