链接: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(){;}

bzoj1972

代码拿走吧……真的很乱七八糟……

转载于:https://www.cnblogs.com/Loser-of-Life/p/7652983.html

bzoj1972 猪国杀 大♂模拟相关推荐

  1. 山大程序设计思维与实践 六月模拟:猪国杀

    六月模拟:猪国杀 山东大学计算机科学与技术学院程序设计思维与实践作业 山大程序设计思维与实践 sdu程序设计思维与实践 山东大学程序设计思维实践作业H 山大程序设计思维实践作业H 山东大学程序设计思维 ...

  2. 【模拟】【bzoj1972】【SDOI2010】猪国杀

    1972:[SDOI2010]猪国杀 [题目描述] <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色 ...

  3. BZOJ1972:[SDOI2010]猪国杀

    我对模拟的理解:https://www.cnblogs.com/AKMer/p/9064018.html 题目传送门:https://www.lydsy.com/JudgeOnline/problem ...

  4. [洛谷P2482][SDOI2010]猪国杀

    题目大意:猪国杀,又一道大模拟题 题解:模拟,对于一个没有玩过三国杀的人来说,一堆细节不知道,写的十分吃力 卡点:无数,不想说什么了,这告诉我要多玩游戏 C++ Code: #include < ...

  5. [luogu P2482] [SDOI2010]猪国杀

    [luogu P2482] [SDOI2010]猪国杀 题目描述 <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只 ...

  6. [sdoi]猪国杀 题面

    题目描述 Description <猪国杀>是一种多猪牌类回合制游戏,一共有三种角色:主猪,忠猪,反猪.每局游戏主猪有且只有一只,忠猪和反猪可以有多只,每只猪扮演一种角色. 游戏目的: 主 ...

  7. 洛谷P2482 [SDOI2010]猪国杀 题解

    本来这题打算5.15省选考完之后晚上做的,然而15号考了一天的试,于是放16号晚上做了. 原题传送门 题目分析 猪国杀是一道桌游三国杀的简化版,这道题在代码涉及的知识点上难度很低,主要难度就在于如何实 ...

  8. [SDOI2010] 猪国杀

    NOIp前最后皮一下,祝自己RP++. 从昨天晚上开始写,一直写到现在才A...... 在LXD大佬的帮助下,终于A掉了...... 还发现有两道大模拟,一个是琪露诺的冰雪小屋,一个是杀蚂蚁,有兴趣的 ...

  9. [海军国际项目办公室]猪国杀

    猪国杀 题解 为什么总有**出题人喜欢用一些毒瘤题的题目名字来命名题目呀. 看到这种题一般很容易想到通过 d p dp dp来进行转移吧. 我们先考虑一下如果我们要选牌的话怎么选才能让我们获得的牌尽量 ...

最新文章

  1. 团队开发经验:如何带领一个项目团队并做好项目总结 !!
  2. 栈的应用实例——计算后缀表达式
  3. 小程序向java后台发送图片_微信小程序在后台如何将二进制流转换成图片
  4. 90后美女大学生,年薪30W的程序员,他们都决定去送外卖了!
  5. 【转】win7 32位安装oracle10g步骤
  6. Citrix XenApp 5.0 Uninstall
  7. 多生产者_【并发那些事】生产者消费者问题
  8. sql server 新语法 收藏
  9. win10文件后缀名怎么显示_显示文件类型扩展名图文教程,win电脑系统文件修改后缀名方法...
  10. linux MySQL数据备份
  11. Ubuntu常用软件大全
  12. mysql读写分离优点_mysql读写分离
  13. 如何做好一场技术分享,100%纯实用技巧输出
  14. getc()、gets()、getchar()、scanf()的区别
  15. vcs import src < ros2.repos 或 vcs import --input ros2.repos src 下载失败或速度慢
  16. 【思维模式】拥抱复杂性(第 2 部分数据)
  17. Java读取环境变量
  18. 使用Angular和API服务器显示相关表中的数据
  19. Transaction silently rolled back because it has been marked as rollback-only
  20. 分享 孩子,请记住那些比药家鑫更凶恶的人——21世纪经济导报记者周斌写给张妙儿子的一封信(转)...

热门文章

  1. Linux离线更新conda
  2. fortran function的result
  3. python 编写一段自动下载微信群的聊天记录中的图片并保存到本地的代码
  4. uni-app自定义导航
  5. CSDN博客如何添加量子恒道统计?
  6. [20160302] QQ数据线的思考 / 无私奉献的引导者
  7. 教你使用 SO_REUSEPORT 套接字选项提升服务性能
  8. CAD关于块表操作(com接口c#语言)
  9. jenkins X实践系列(2) —— 基于jx的DevOps实践
  10. 读《An Analysis of the Skype Peer-to-Peer Internet Telephony Protocol》