bzoj1972 猪国杀 大♂模拟
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1972
不要想了这个题面没有办法读的……找个可读版本:https://mubu.com/doc/2707815814591da4
题意:给出一种$AI$人工智障打三国杀的方式,模拟出整个游戏进程。
基本题面就这个意思……内容也没什么……但是这题目里面有好几个坑点:
1、决斗有可能干死自己没杀打什么决斗
2、牌堆可能摸完,摸完牌堆要一直摸最后一张这张牌会分身,摸完还有
3、$BZOJ$样例是错的……少一张万箭齐发……
4、题目描述与数据不符,描述中提到反贼是$AP$实际上是$FP$AntiPig?FanPig?
5、毕竟是群人工智障……所以有的东西不能按照人类规则来……比如濒死状态别人不能出桃……能跳就跳即使这样会导致下一回合被集火……有时候无懈可击不出给自己出给主公或其他队友……
6、每打一张牌,当前牌指针都要归位……因为你打出上一张牌之后可能有人跳了以致之前打不出的牌可以打出……
7、反贼决斗永远出给主公!别听题面瞎$BB$……
8、最坑的一点……这个题会$PE$……
最后提醒一下:千万不要以这个题为契机学习$OOP$……我学习了一下,结果按照$wcx$语录只有变量名、函数名长度像$OOP$……然后代码奇长奇丑无比……在没有注释的情况下写了$12K$……而且这样很难调试……错了$35%$足足两天最后拿到数据才发现本蒟蒻决斗完了制杖地没有重新设计指针为第一张牌……
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=50010; 4 int Bef[maxn],Nex[maxn],cnt;char Kind[maxn],Paidui[3010]; 5 int top,m; 6 char Get_a_Card() 7 { 8 if(top!=m)top++; 9 return Paidui[top]; 10 } 11 int Real_Identity[15],Tot_Enemy; 12 bool Is_Game_Over;int Now_Round; 13 void Kill_Another_Player(int,int); 14 void Get_Into_A_Fight_With_Another_Player(int,int); 15 void Seek_For_A_Kill_From_Everyone(int); 16 void Seek_For_A_Evasion_From_Everyone(int); 17 class pig 18 { 19 public: 20 int Current_Identity,Head,Last,Now,Iter; 21 int Blood,Unassailable_Num,Heart_Num,Evasion_Num; 22 int Att_Target,Las_Player,Nex_Player; 23 bool Is_Dead,Equipped_Arrow; 24 int ID_num; 25 void Print_Cards() 26 { 27 int Now=Head;cout<<Blood<<endl; 28 while(Now)cout<<Kind[Now],Now=Nex[Now]; 29 cout<<endl; 30 } 31 void Get_Bonus_After_Killing_An_Enemy() 32 { 33 cnt++;Kind[cnt]=Get_a_Card();Bef[cnt]=Last; 34 if(!Head)Head=Last=cnt; 35 else Nex[Last]=cnt,Last=cnt; 36 switch(Kind[cnt]) 37 { 38 case 'J':Unassailable_Num++;break; 39 case 'P':Heart_Num++;break; 40 case 'D':Evasion_Num++;break; 41 } 42 cnt++;Kind[cnt]=Get_a_Card();Bef[cnt]=Last,Nex[Last]=cnt,Last=cnt; 43 switch(Kind[cnt]) 44 { 45 case 'J':Unassailable_Num++;break; 46 case 'P':Heart_Num++;break; 47 case 'D':Evasion_Num++;break; 48 } 49 cnt++;Kind[cnt]=Get_a_Card();Bef[cnt]=Last,Nex[Last]=cnt,Last=cnt; 50 switch(Kind[cnt]) 51 { 52 case 'J':Unassailable_Num++;break; 53 case 'P':Heart_Num++;break; 54 case 'D':Evasion_Num++;break; 55 } 56 } 57 void Get_Punish_After_Killing_An_Teammate() 58 { 59 Head=Last=Now=0; 60 Unassailable_Num=Heart_Num=Evasion_Num=0; 61 Equipped_Arrow=0; 62 } 63 void Stage_When_A_Player_Get_Cards() 64 { 65 cnt++;Kind[cnt]=Get_a_Card();Bef[cnt]=Last; 66 if(!Head)Head=Last=cnt; 67 else Nex[Last]=cnt,Last=cnt; 68 switch(Kind[cnt]) 69 { 70 case 'J':Unassailable_Num++;break; 71 case 'P':Heart_Num++;break; 72 case 'D':Evasion_Num++;break; 73 } 74 cnt++;Kind[cnt]=Get_a_Card();Bef[cnt]=Last,Nex[Last]=cnt,Last=cnt; 75 switch(Kind[cnt]) 76 { 77 case 'J':Unassailable_Num++;break; 78 case 'P':Heart_Num++;break; 79 case 'D':Evasion_Num++;break; 80 } 81 } 82 void Stage_When_A_Player_Tries_To_Use_A_Card(int x) 83 { 84 switch(Kind[x]) 85 { 86 case 'J':Unassailable_Num--;break; 87 case 'P':Heart_Num--;break; 88 case 'D':Evasion_Num--;break; 89 } 90 if(x==Head&&x==Last)Head=Last=0; 91 else if(x==Head)Head=Nex[x],Bef[Nex[x]]=0; 92 else if(x==Last)Last=Bef[x],Nex[Bef[x]]=0; 93 else Bef[Nex[x]]=Bef[x],Nex[Bef[x]]=Nex[x]; 94 } 95 char Show_A_Players_Next_Card() 96 { 97 if(!Now)return 0; 98 Iter=Now;Now=Nex[Now]; 99 return Kind[Iter]; 100 } 101 void Output_The_Final_Answer() 102 { 103 if(Is_Dead)puts("DEAD"); 104 else 105 { 106 while(Head) 107 { 108 cout<<Kind[Head]; 109 if(Head!=Last)putchar(' '); 110 Head=Nex[Head]; 111 } 112 puts(""); 113 } 114 } 115 int Get_The_ID_Of_The_First_Evasion() 116 { 117 Now=Head;char tmp; 118 while(tmp=Show_A_Players_Next_Card()) 119 if(tmp=='D')return Iter; 120 } 121 int Get_The_ID_Of_The_First_Heart() 122 { 123 Now=Head;char tmp; 124 while(tmp=Show_A_Players_Next_Card()) 125 if(tmp=='P')return Iter; 126 } 127 int Get_The_ID_Of_The_First_Unassailable() 128 { 129 Now=Head;char tmp; 130 while(tmp=Show_A_Players_Next_Card()) 131 if(tmp=='J')return Iter; 132 } 133 bool Try_To_Use_A_Kill() 134 { 135 Now=Head;char tmp; 136 while(tmp=Show_A_Players_Next_Card()) 137 if(tmp=='K'){Stage_When_A_Player_Tries_To_Use_A_Card(Iter);return 1;} 138 return 0; 139 } 140 bool Try_To_Use_A_Evasion() 141 { 142 if(Evasion_Num){Stage_When_A_Player_Tries_To_Use_A_Card(Get_The_ID_Of_The_First_Evasion());return 1;} 143 return 0; 144 } 145 bool Try_To_Use_A_Heart() 146 { 147 if(Heart_Num){Stage_When_A_Player_Tries_To_Use_A_Card(Get_The_ID_Of_The_First_Heart());return 1;} 148 return 0; 149 } 150 bool Try_To_Use_A_Unassailable() 151 { 152 if(Unassailable_Num){Stage_When_A_Player_Tries_To_Use_A_Card(Get_The_ID_Of_The_First_Unassailable());return 1;} 153 return 0; 154 } 155 void One_Players_Round() 156 { 157 Stage_When_A_Player_Get_Cards(); 158 Now=Head;char tmp;bool Kill_Has_Used=0; 159 while((tmp=Show_A_Players_Next_Card())&&!Is_Game_Over) 160 { 161 switch(tmp) 162 { 163 case 'D':break; 164 case 'J':break; 165 case 'P':if(Blood!=4)Blood++,Stage_When_A_Player_Tries_To_Use_A_Card(Iter);break; 166 case 'K':if(Att_Target==Nex_Player) 167 if(!Kill_Has_Used||Equipped_Arrow) 168 { 169 Stage_When_A_Player_Tries_To_Use_A_Card(Iter),Kill_Another_Player(ID_num,Att_Target); 170 Now=Head;Kill_Has_Used=1; 171 if(Is_Game_Over)return; 172 } 173 break; 174 case 'F':if(!Att_Target)break; 175 Stage_When_A_Player_Tries_To_Use_A_Card(Iter); 176 if(Real_Identity[ID_num]==3)Get_Into_A_Fight_With_Another_Player(ID_num,1); 177 else Get_Into_A_Fight_With_Another_Player(ID_num,Att_Target); 178 if(Is_Game_Over||Is_Dead)return; 179 Now=Head; 180 break; 181 case 'N':Stage_When_A_Player_Tries_To_Use_A_Card(Iter); 182 Seek_For_A_Kill_From_Everyone(ID_num);Now=Head; 183 if(Is_Game_Over)return; 184 break; 185 case 'W':Stage_When_A_Player_Tries_To_Use_A_Card(Iter); 186 Seek_For_A_Evasion_From_Everyone(ID_num);Now=Head; 187 if(Is_Game_Over)return; 188 break; 189 case 'Z':Stage_When_A_Player_Tries_To_Use_A_Card(Iter); 190 Equipped_Arrow=1;Now=Head;break; 191 } 192 } 193 } 194 }Players[11]; 195 void Refresh_The_Infection_Of_One_Player_In_Everyones_Mind(int x) 196 { 197 int y=Players[x].Nex_Player; 198 switch(Real_Identity[x]) 199 { 200 case 1:while(y!=x) 201 { 202 if(Players[y].Current_Identity==1||Players[y].Current_Identity==3){Players[x].Att_Target=y;return;} 203 y=Players[y].Nex_Player; 204 } 205 Players[x].Att_Target=0;break; 206 case 2:while(y!=x) 207 { 208 if(Players[y].Current_Identity==3){Players[x].Att_Target=y;return;} 209 y=Players[y].Nex_Player; 210 } 211 Players[x].Att_Target=0;break; 212 case 3:while(y!=x) 213 { 214 if(Players[y].Current_Identity==2||Real_Identity[y]==1){Players[x].Att_Target=y;return;} 215 y=Players[y].Nex_Player; 216 } 217 Players[x].Att_Target=0; 218 } 219 } 220 void Every_Player_Try_To_Refresh_Their_Infection() 221 { 222 int x=Players[1].Nex_Player;Refresh_The_Infection_Of_One_Player_In_Everyones_Mind(1); 223 while(x!=1)Refresh_The_Infection_Of_One_Player_In_Everyones_Mind(x),x=Players[x].Nex_Player; 224 } 225 void A_Player_Was_Killed_By_Another_One(int x,int y) 226 { 227 Players[y].Is_Dead=1; 228 if(Real_Identity[y]==1){Is_Game_Over=1;return;} 229 if(Real_Identity[y]==3) 230 { 231 Tot_Enemy--; 232 if(!Tot_Enemy){Is_Game_Over=1;return;} 233 Players[x].Get_Bonus_After_Killing_An_Enemy(); 234 } 235 if(Real_Identity[y]==2&&Real_Identity[x]==1)Players[x].Get_Punish_After_Killing_An_Teammate(); 236 int BEFO=Players[y].Las_Player,NEXT=Players[y].Nex_Player; 237 Players[BEFO].Nex_Player=NEXT,Players[NEXT].Las_Player=BEFO; 238 Every_Player_Try_To_Refresh_Their_Infection(); 239 } 240 void A_Player_Was_Wounded_By_Another_One(int x,int y) 241 { 242 Players[y].Blood--; 243 if(!Players[y].Blood) 244 if(Players[y].Try_To_Use_A_Heart())Players[y].Blood++; 245 else A_Player_Was_Killed_By_Another_One(x,y); 246 } 247 void Kill_Another_Player(int x,int y) 248 { 249 if(Real_Identity[x]!=1&&Players[x].Current_Identity<2) 250 { 251 if(Real_Identity[y]==3)Players[x].Current_Identity=2; 252 else Players[x].Current_Identity=3; 253 Every_Player_Try_To_Refresh_Their_Infection(); 254 } 255 if(Players[y].Try_To_Use_A_Evasion())return; 256 A_Player_Was_Wounded_By_Another_One(x,y); 257 } 258 bool Start_An_Unassailable_Cycle(int st,bool Is_He_An_Enemy) 259 { 260 bool ST=Is_He_An_Enemy;int Last_One_Who_Show_An_Unassailble=st,x=st; 261 if(Is_He_An_Enemy==(Real_Identity[x]==3)) 262 if(Players[x].Try_To_Use_A_Unassailable()) 263 { 264 Last_One_Who_Show_An_Unassailble=x,Is_He_An_Enemy^=1; 265 if(Players[x].Current_Identity<=2)Players[x].Current_Identity=3-Is_He_An_Enemy,Every_Player_Try_To_Refresh_Their_Infection(); 266 } 267 x=Players[x].Nex_Player; 268 while(x!=Last_One_Who_Show_An_Unassailble) 269 { 270 if(Is_He_An_Enemy==(Real_Identity[x]==3)) 271 if(Players[x].Try_To_Use_A_Unassailable()) 272 { 273 Last_One_Who_Show_An_Unassailble=x,Is_He_An_Enemy^=1; 274 if(Players[x].Current_Identity<=2)Players[x].Current_Identity=3-Is_He_An_Enemy,Every_Player_Try_To_Refresh_Their_Infection(); 275 } 276 x=Players[x].Nex_Player; 277 } 278 return (ST!=Is_He_An_Enemy); 279 } 280 void Get_Into_A_Fight_With_Another_Player(int x,int y) 281 { 282 if(Real_Identity[x]!=1&&Players[x].Current_Identity<2) 283 { 284 if(Real_Identity[y]==3)Players[x].Current_Identity=2; 285 else Players[x].Current_Identity=3; 286 Every_Player_Try_To_Refresh_Their_Infection(); 287 } 288 if(Real_Identity[y]==1||Players[y].Current_Identity>=2) 289 { 290 if(Real_Identity[y]==1||Players[y].Current_Identity==2) 291 { 292 if(Start_An_Unassailable_Cycle(x,0))return; 293 } 294 else if(Start_An_Unassailable_Cycle(x,1))return; 295 } 296 if(Real_Identity[x]==1&&Real_Identity[y]==2)A_Player_Was_Wounded_By_Another_One(x,y); 297 else while(1) 298 { 299 if(!Players[y].Try_To_Use_A_Kill()){A_Player_Was_Wounded_By_Another_One(x,y);return;} 300 if(!Players[x].Try_To_Use_A_Kill()){A_Player_Was_Wounded_By_Another_One(y,x);return;} 301 } 302 } 303 void Seek_For_A_Kill_From_Everyone(int x) 304 { 305 int y=Players[x].Nex_Player; 306 while(y!=x) 307 { 308 if(Real_Identity[y]==1||Players[y].Current_Identity>=2) 309 { 310 if(Real_Identity[y]==1||Players[y].Current_Identity==2) 311 { 312 if(Start_An_Unassailable_Cycle(x,0)){y=Players[y].Nex_Player;continue;} 313 } 314 else if(Start_An_Unassailable_Cycle(x,1)){y=Players[y].Nex_Player;continue;} 315 } 316 if(!Players[y].Try_To_Use_A_Kill()) 317 { 318 A_Player_Was_Wounded_By_Another_One(x,y); 319 if(Is_Game_Over)return; 320 if(y==1&&Players[x].Current_Identity==0)Players[x].Current_Identity=1,Every_Player_Try_To_Refresh_Their_Infection(); 321 } 322 y=Players[y].Nex_Player; 323 } 324 } 325 void Seek_For_A_Evasion_From_Everyone(int x) 326 { 327 int y=Players[x].Nex_Player; 328 while(y!=x) 329 { 330 if(Real_Identity[y]==1||Players[y].Current_Identity>=2) 331 { 332 if(Real_Identity[y]==1||Players[y].Current_Identity==2) 333 { 334 if(Start_An_Unassailable_Cycle(x,0)){y=Players[y].Nex_Player;continue;} 335 } 336 else if(Start_An_Unassailable_Cycle(x,1)){y=Players[y].Nex_Player;continue;} 337 } 338 if(!Players[y].Try_To_Use_A_Evasion()) 339 { 340 A_Player_Was_Wounded_By_Another_One(x,y); 341 if(Is_Game_Over)return; 342 if(y==1&&!Players[x].Current_Identity)Players[x].Current_Identity=1,Every_Player_Try_To_Refresh_Their_Infection(); 343 } 344 y=Players[y].Nex_Player; 345 } 346 } 347 int haha() 348 { 349 freopen("kopk.in","r",stdin); 350 freopen("kopk.out","w",stdout); 351 int n;scanf("%d%d",&n,&m); 352 int x=0;char opt[10]; 353 for(int i=1;i<n;i++)Players[i].Nex_Player=i+1;Players[n].Nex_Player=1; 354 Players[1].Las_Player=n;for(int i=2;i<=n;i++)Players[i].Las_Player=i-1; 355 for(int i=1;i<=n;i++) 356 { 357 scanf("%s",opt); 358 switch(opt[0]) 359 { 360 case 'M':Real_Identity[i]=1;break; 361 case 'Z':Real_Identity[i]=2;break; 362 case 'F':Real_Identity[i]=3,Tot_Enemy++;break; 363 } 364 scanf("%s",opt),x++,Paidui[x]=opt[0]; 365 scanf("%s",opt),x++,Paidui[x]=opt[0]; 366 scanf("%s",opt),x++,Paidui[x]=opt[0]; 367 scanf("%s",opt),x++,Paidui[x]=opt[0]; 368 } 369 for(int i=1;i<=m;i++)scanf("%s",opt),x++,Paidui[x]=opt[0]; 370 m+=4*n; 371 for(int i=1;i<=n;i++) 372 Players[i].Stage_When_A_Player_Get_Cards(),Players[i].Stage_When_A_Player_Get_Cards(), 373 Players[i].ID_num=i,Players[i].Blood=4; 374 int now=1;Every_Player_Try_To_Refresh_Their_Infection(); 375 while(!Is_Game_Over)Now_Round=now,Players[now].One_Players_Round(),now=Players[now].Nex_Player; 376 if(Players[1].Is_Dead)puts("FP");else puts("MP"); 377 for(int i=1;i<=n;i++)Players[i].Output_The_Final_Answer(); 378 } 379 int sb=haha(); 380 int main(){;}
bzoj1972
代码拿走吧……真的很乱七八糟……
转载于:https://www.cnblogs.com/Loser-of-Life/p/7652983.html
bzoj1972 猪国杀 大♂模拟相关推荐
- 山大程序设计思维与实践 六月模拟:猪国杀
六月模拟:猪国杀 山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业H 山大程序设计思维实践作业H 山东大学程序设计思维 ...
- 【模拟】【bzoj1972】【SDOI2010】猪国杀
1972:[SDOI2010]猪国杀 [题目描述] <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色 ...
- BZOJ1972:[SDOI2010]猪国杀
我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...
- [洛谷P2482][SDOI2010]猪国杀
题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...
- [luogu P2482] [SDOI2010]猪国杀
[luogu P2482] [SDOI2010]猪国杀 题目描述 <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只 ...
- [sdoi]猪国杀 题面
题目描述 Description <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色. 游戏目的: 主 ...
- 洛谷P2482 [SDOI2010]猪国杀 题解
本来这题打算5.15省选考完之后晚上做的,然而15号考了一天的试,于是放16号晚上做了. 原题传送门 题目分析 猪国杀是一道桌游三国杀的简化版,这道题在代码涉及的知识点上难度很低,主要难度就在于如何实 ...
- [SDOI2010] 猪国杀
NOIp前最后皮一下,祝自己RP++. 从昨天晚上开始写,一直写到现在才A...... 在LXD大佬的帮助下,终于A掉了...... 还发现有两道大模拟,一个是琪露诺的冰雪小屋,一个是杀蚂蚁,有兴趣的 ...
- [海军国际项目办公室]猪国杀
猪国杀 题解 为什么总有**出题人喜欢用一些毒瘤题的题目名字来命名题目呀. 看到这种题一般很容易想到通过 d p dp dp来进行转移吧. 我们先考虑一下如果我们要选牌的话怎么选才能让我们获得的牌尽量 ...
最新文章
- 团队开发经验:如何带领一个项目团队并做好项目总结 !!
- 栈的应用实例——计算后缀表达式
- 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片
- 90后美女大学生,年薪30W的程序员,他们都决定去送外卖了!
- 【转】win7 32位安装oracle10g步骤
- Citrix XenApp 5.0 Uninstall
- 多生产者_【并发那些事】生产者消费者问题
- sql server 新语法 收藏
- win10文件后缀名怎么显示_显示文件类型扩展名图文教程,win电脑系统文件修改后缀名方法...
- linux MySQL数据备份
- Ubuntu常用软件大全
- mysql读写分离优点_mysql读写分离
- 如何做好一场技术分享,100%纯实用技巧输出
- getc()、gets()、getchar()、scanf()的区别
- vcs import src < ros2.repos 或 vcs import --input ros2.repos src 下载失败或速度慢
- 【思维模式】拥抱复杂性(第 2 部分数据)
- Java读取环境变量
- 使用Angular和API服务器显示相关表中的数据
- Transaction silently rolled back because it has been marked as rollback-only
- 分享 孩子,请记住那些比药家鑫更凶恶的人——21世纪经济导报记者周斌写给张妙儿子的一封信(转)...
热门文章
- Linux离线更新conda
- fortran function的result
- python 编写一段自动下载微信群的聊天记录中的图片并保存到本地的代码
- uni-app自定义导航
- CSDN博客如何添加量子恒道统计?
- [20160302] QQ数据线的思考 / 无私奉献的引导者
- 教你使用 SO_REUSEPORT 套接字选项提升服务性能
- CAD关于块表操作(com接口c#语言)
- jenkins X实践系列(2) —— 基于jx的DevOps实践
- 读《An Analysis of the Skype Peer-to-Peer Internet Telephony Protocol》