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%$足足两天最后拿到数据才发现本蒟蒻决斗完了制杖地没有重新设计指针为第一张牌……
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(){;}
代码拿走吧……真的很乱七八糟……
只要是活着的东西,就算是神我也杀给你看。