码迷,mamicode.com
首页 > 其他好文 > 详细

大模拟1.0

时间:2017-10-11 21:51:59      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:isp   水平   很多   ems   closed   str   printf   一点   lap   

          小学期集训结束前我说过想见识见识大搜索大模拟OwO,现在我的愿望已经充分得到了满足……

 

  猪国杀

先附一个可读版规则【幕布·猪国杀可读版】,做题过程发出来基本就是题解……从来没有打过三国杀的人从这道题中开拓了视野丰富了人生……

questions

1.桃:在自己的回合外血变为0或更低可以使用
死亡:体力降到0或更低,并且手中没有足够的桃回到1就死亡
如果吃了桃还不够是吃了再死还是直接死?
A:无所谓,因为不要求输出已死玩家的牌。何况体力不可能比0还低
如果要求得细一点,就是回合外补到1就停下,之后有危险会再得到机会的

2.杀是基本牌不是锦囊牌,无懈可击在目标锦囊生效前抵消效果
表敌意包括使用杀
无懈可击可以抵消表敌意
那无懈可击到底抵不抵消杀?
A:不抵,不要管那个诡异叙述

3.什么样的情况下献殷勤居然被抵消了?
一只猪向同伙猪献殷勤,敌人阻止它献殷勤

4.决斗中的献殷勤是怎么回事?
A:向敌人决斗,敌人被敌人一伙救了,就是敌人被献殷勤了~

5.挡下万箭齐发到底属于对谁献殷勤?
A:对本来会受到伤害的那只猪、本来被表敌意的那只猪

UPD:这些question只因为我是个没打过三国杀的人……

 

problems

1.清空了主猪的牌也要清空主猪的使用记录

2.决斗是被挑战方先弃杀,然后挑战方弃这样循环,先没有牌弃的掉血。即使挑战方现在也没有
牌而轮到被挑战方,也算被挑战方输

3.决斗的无懈可击在决斗开始前生效,南猪入侵和万箭齐发的无懈可击在结算到相应角色时生效

4.主猪的编号是1不是0,主猪一开始就已明身份

5.回合里出完每一张牌都需要检查游戏是否结束,不结束还要从头开始遍历这只猪的所有牌。
会有新的猪跳导致这只猪原来没有出的牌可以出了

6.题本身的坑:牌堆里没牌了一直抽最后一张,反猪是FP不是AP,最多10头猪不是5头

7.最先有机会无懈可击的是出锦囊的猪自己。它可以无懈掉自己的南猪入侵或万箭齐发来保护同伙

 

simples

1.

5 10
MP W D F K
ZP N N D D
FP F W W K
ZP K K N D
FP K D P W
J K W K D N N K J N

 

MP
F N
D
DEAD

 

DEAD

2.

3 4
MP J J K N
ZP J D K W
FP P N P K
J J K W

 

MP
K
K
DEAD

3.

3 10
MP W D J W
ZP J P D N
FP N D F F
J D N N F J J D K W

 

MP
D J D

 

DEAD

4.

3 1
MP D N F K
ZP F W F N
FP D N N D
K

 

MP
K
F K K
DEAD

 

如果没有小样例只有测试点也不要怕,输出十几步一点点算总能看出来的。打程序的过程是痛苦的,调程序的过程是欢乐的,因为就像打游戏一样一张张看这群猪出什么牌简直上瘾。最难写的是无懈可击,因为是唯一需要递归调用的想了很久才实现出来,不过毕竟是经过深思熟虑这一部分写完就没有出过问题。调的时候问题集中在决斗上,一方面手误不少一方面对规则也不大清晰错了一堆。对题目熟悉了之后感觉题变短了,刚开始一点一点找规则到后来已经可以脱离规则自己玩起来,输出大段调试信息一行一行核对不知不觉几个小时就过去了。10月9号写了一上午只打了个框,10月10号继续写完了无懈可击调了一个晚上,10月11号早上调了一节课下午改完题三点多才过。过程中也经历了很多怀疑自己的时候,比如说牌不用链表维护到底会不会炸掉、到底能不能自己设计出无懈可击、规则里面有很多弄不明白的地方(后来我发现我身边的同学们都是行家啊),总之还是做到了。撑着独立完成了这道题感觉很好,果然年轻人就是应该做点自己都觉得困难的事嘛。下次你们再打三国杀的时候或许我可以去围观了?(鉴于水平仅限于这道题还是不要参加的好)不过这种题要是放出来考真是可怕啊。

技术分享
  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<queue>
  5 using namespace std;
  6 const int pig=12;
  7 const int card=4005;
  8 int  tot[pig],cnt[pig],typ[pig],tl[pig],real[pig];
  9 bool zb[pig],used[pig][card],dead[pig],like[pig];
 10 char p[pig][card];//about every pig
 11 int  n,m,sum,cot,nt[pig],pr[pig],aim;
 12 bool op;
 13 char a[5],la,tp;
 14 queue<char>  q;//about the game
 15 void init()
 16 {
 17     scanf("%d%d",&n,&m);
 18     for(int i=1;i<=n;i++)
 19     {
 20         pr[i]=i-1,nt[i]=i+1;
 21         tl[i]=tot[i]=cnt[i]=4;
 22         scanf("%s",a);
 23         if(a[0]==M)  typ[i]=0;//main
 24         if(a[0]==Z)  typ[i]=1;//zhong
 25         if(a[0]==F)  typ[i]=2;//anti
 26         for(int j=1;j<=4;j++)
 27             scanf("%s",a),p[i][j]=a[0];
 28     }
 29     real[1]=1,pr[1]=n,nt[n]=1;
 30     for(int i=1;i<=m;i++)
 31         scanf("%s",a),q.push(a[0]);//heap
 32 }//scanf the data  *
 33 void mp(int x,int tim)
 34 {
 35     for(int i=1;i<=tim;i++)
 36     {
 37         if(!q.empty())  tp=q.front(),q.pop();
 38         else            tp=la;
 39         tot[x]++,cnt[x]++;
 40         p[x][tot[x]]=tp;
 41         if(q.empty())  la=tp;
 42     }
 43 }//get new cards  *
 44 void outit()
 45 {
 46     if(dead[1])  printf("FP\n");
 47     else         printf("MP\n");//who win
 48     for(int i=1;i<n;i++)
 49     {
 50         if(dead[i])  printf("DEAD\n");
 51         else
 52         {
 53             if(cnt[i]==0){  printf("\n");continue;  }
 54             cot=0;
 55             for(int j=1;j<=tot[i];j++)
 56                 if(!used[i][j])
 57                 {   
 58                     cot++,printf("%c",p[i][j]);
 59                     if(cot==cnt[i])  printf("\n");//prevent spare empty
 60                     else             printf(" ");
 61                 }
 62         }
 63     }
 64     if(dead[n])  printf("DEAD");//prevent spare enter
 65     else
 66     {
 67         if(cnt[n]==0)  return;
 68         cot=0;
 69         for(int j=1;j<=tot[n];j++)
 70             if(!used[n][j])
 71             {
 72                 cot++,printf("%c",p[n][j]);
 73                 if(cot!=cnt[n])  printf(" ");
 74             }
 75     }
 76 }//printf the answer  *
 77 bool check()
 78 { 
 79     if(dead[1])  return 1;//main died
 80     op=1;
 81     for(int i=1;i<=n;i++)
 82         if(!dead[i]&&typ[i]==2)
 83             op=0;//all anti died
 84     if(op)  return 1;
 85     return 0;
 86 }//end the game  *
 87 bool have(int x)
 88 {
 89     for(int i=1;i<=tot[x];i++)
 90         if(!used[x][i]&&p[x][i]==J)
 91         {
 92             used[x][i]=1;
 93             cnt[x]--;
 94             if(x!=1)  real[x]=typ[x],like[x]=0;
 95             return 1;
 96         }
 97     return 0;
 98 }//have a wuxie then use it  *
 99 bool wx(int ap,int om,bool kind)
100 {
101     if(!real[om])  return kind;
102     if(kind==1&&(typ[ap]==real[om]||(typ[ap]==0&&real[om]==1)))
103         if(have(ap))
104             return wx(ap,om,kind^1);
105     if(kind==0&&(typ[ap]==3-real[om]||(typ[ap]==0&&(real[om]==2||like[om]))))
106         if(have(ap))
107             return wx(ap,om,kind^1);
108     for(int i=nt[ap];i!=ap;i=nt[i])
109     {
110         if(kind==1&&(typ[i]==real[om]||(typ[i]==0&&real[om]==1)))
111             if(have(i))
112             {
113                 kind=wx(i,om,kind^1);
114                 break;
115             }
116         if(kind==0&&(typ[i]==3-real[om]||(typ[i]==0&&(real[om]==2||like[om]))))
117             if(have(i))
118             {
119                 kind=wx(i,om,kind^1);
120                 break;
121             }
122     }
123     return kind;
124 }//wu xie ke ji
125 void jz(int x,int killer)
126 {
127     if(tl[x]==0)
128     {
129         for(int k=1;k<=tot[x];k++)
130             if(!used[x][k]&&p[x][k]==P)
131             {
132                 used[x][k]=1;
133                 tl[x]++,cnt[x]--;
134                 break;
135             }//have some peaches
136         if(tl[x]<1)
137         {
138             dead[x]=1;
139             if(check())  return;
140             if(typ[x]==2)  mp(killer,3);
141             else  if(typ[x]==1&&killer==1)
142             {
143                 tot[1]=cnt[1]=zb[1]=0;
144                 memset(p[1],0,sizeof(p[1]));
145                 memset(used[1],0,sizeof(used[1]));
146             }
147             nt[pr[x]]=nt[x];
148             pr[nt[pr[x]]]=pr[x];
149         }//really died                  
150     }   
151 }//kill or save the pig  *
152 void jd(int x,int y)
153 {
154     if(typ[y]==0&&typ[x]==1)  swap(x,y);
155     if(typ[x]==0&&typ[y]==1)
156     {
157         tl[y]--,jz(y,x);
158         return;
159     }//main vs zhong
160     for(int i=1;i<=tot[x];i++)
161         if(!used[x][i]&&p[x][i]==K)
162         {
163             op=0,used[x][i]=1,cnt[x]--;
164             for(int j=1;j<=tot[y];j++)
165                 if(!used[y][j]&&p[y][j]==K)
166                 {
167                     used[y][j]=op=1;
168                     cnt[y]--;
169                     break;
170                 }
171             if(op==0)
172             {
173                 tl[y]--,jz(y,x);
174                 if(real[y]&&x!=1)  real[x]=typ[x],like[x]=0;
175                 return;
176             }//y first have no kill
177         }
178     tl[x]--,jz(x,y);
179     if(real[x]&&y!=1)  real[y]=typ[y],like[y]=0;
180     return;//x first have no kill
181 }//jue dou *
182 void nm(int x)
183 {
184     for(int i=nt[x];i!=x;i=nt[i])
185     {
186         if(!wx(x,i,1))  continue;
187         op=0;
188         for(int j=1;j<=tot[i];j++)
189             if(!used[i][j]&&p[i][j]==K)
190             {
191                 used[i][j]=op=1;
192                 cnt[i]--;
193                 break;
194             }
195         if(!op)
196         {
197                 tl[i]--,jz(i,x);
198                 if(check())  return;
199                 if(!real[x]&&i==1)  like[x]=1;
200         }
201     }
202 }//nan zhu ru qin
203 void wj(int x)
204 {
205     for(int i=nt[x];i!=x;i=nt[i])
206     {
207         if(!wx(x,i,1))  continue;
208         op=0;
209         for(int j=1;j<=tot[i];j++)
210             if(!used[i][j]&&p[i][j]==D)
211             {
212                 used[i][j]=op=1;
213                 cnt[i]--;
214                 break;
215             }
216         if(!op)
217         {
218             tl[i]--,jz(i,x);
219             if(check())  return;
220             if(!real[x]&&i==1)  like[x]=1;
221         }
222     }
223 }//wan jian qi fa
224 int main()
225 {
226     init();
227     while(1)
228     {
229         if(check())  break;
230         for(int i=1;i<=n;i++)
231         {
232             if(check())  break;
233             if(dead[i])  continue;
234             mp(i,2);
235             cot=0;
236             for(int j=1;j<=tot[i];j++)
237             {
238                 if(dead[i])   break;
239                 if(check())   break;
240                 if(used[i][j])  continue;
241                 if(tl[i]!=4&&p[i][j]==P)
242                 {
243                     used[i][j]=1;
244                     tl[i]++,cnt[i]--;
245                 }//peach  *
246                 if(p[i][j]==K)
247                 {
248                     if(cot!=0&&!zb[i])   continue;//only once
249                     if(typ[i]==0&&!like[nt[i]]&&real[nt[i]]!=2)  continue;
250                     if(typ[i]==1&&real[nt[i]]!=2)   continue;
251                     if(typ[i]==2&&real[nt[i]]!=1)   continue;//have no enemy  
252                     cot++;
253                     used[i][j]=1,cnt[i]--,op=0;
254                     if(real[nt[i]])  real[i]=3-real[nt[i]],like[i]=0;
255                     for(int k=1;k<=tot[nt[i]];k++)
256                         if(!used[nt[i]][k]&&p[nt[i]][k]==D)
257                         {
258                             used[nt[i]][k]=op=1;
259                             cnt[nt[i]]--;
260                             break;
261                         }//miss
262                     if(!op)
263                     {
264                         tl[nt[i]]--;
265                         jz(nt[i],i);
266                     }
267                 }//kill   *
268                 if(p[i][j]==F)
269                 {
270                     aim=0;
271                     if(typ[i]==2)  aim=1;//anti‘s aim is main
272                     else
273                         for(int k=nt[i];k!=i;k=nt[k])
274                             if(real[k]==2||(i==1&&like[k]))
275                             {
276                                 aim=k;
277                                 break;
278                             }
279                     if(aim==0)  continue;
280                     if(real[aim]&&i!=1)  real[i]=typ[i],like[i]=0;
281                     used[i][j]=1,cnt[i]--,op=0;
282                     if(real[aim])
283                         if(!wx(i,aim,1))
284                         {
285                             op=1,j=0;
286                             continue;
287                         }
288                     if(op==0)   jd(aim,i);
289                 }//fight   *
290                 if(p[i][j]==N) 
291                 {
292                     used[i][j]=1,cnt[i]--;    
293                     nm(i);
294                 }//north   *
295                 if(p[i][j]==W)  
296                 {
297                     used[i][j]=1,cnt[i]--;
298                     wj(i);
299                 }//wound   *
300                 if(p[i][j]==Z)
301                 {
302                     used[i][j]=zb[i]=1;
303                     cnt[i]--;
304                 }//zhuge   *
305                 if(used[i][j]&&p[i][j]!=P)  j=0;
306             }
307           
308         }
309     }
310     outit();
311     return 0;
312 }
kopk

 

大模拟1.0

标签:isp   水平   很多   ems   closed   str   printf   一点   lap   

原文地址:http://www.cnblogs.com/moyiii-/p/7652826.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!