大模拟1.0
Posted moyiii
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了大模拟1.0相关的知识,希望对你有一定的参考价值。
小学期集训结束前我说过想见识见识大搜索大模拟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 }
以上是关于大模拟1.0的主要内容,如果未能解决你的问题,请参考以下文章