[SDOI2010]猪国杀

Posted Der Barde, Nietzsche

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[SDOI2010]猪国杀相关的知识,希望对你有一定的参考价值。

题面

(这个做题面的大佬太赞啦)

无聊啊~~~然后就写大模拟,然后就从早上写到下午,生活得到了极大的充实

注意事项:

牌库为空之后再抽牌,会重复抽最后一张被抽走牌

无论在任何过程中,游戏结束(主公死或反贼全死),都中断游戏,直接进入输出阶段

所有人一开始都知道主公的身份

每个人都会无条件帮队友无懈掉决斗万箭南蛮

每个人都会无条件无懈掉对手的无懈

每个人都不会无懈掉队友的无懈

玩家自己的出牌阶段,当玩家用完某一张牌之后,他会从头检索自己之前检索过的牌,看看他们是不是现在可以用了。

反贼当然只会决斗主公啦~~~~

忠臣被主公决斗并不能算跳忠

没了

代码:

技术分享图片
  1 #include<cstdio>
  2 #include<cstring>
  3 #include<algorithm>
  4 #include<cmath>
  5 #include<cstdlib>
  6 using namespace std;
  7 struct Player{
  8     int cardsiz,Hp;
  9     char typ;
 10     char card[2010];
 11     bool eq;
 12 }player[20];
 13 char kn[11],Car_p[2010],sss[10];
 14 int nxt[20],las[20];
 15 int n,m,Fz;
 16 bool ed;
 17 void Input();
 18 void Work();
 19 void Output();
 20 void get_card(int );
 21 void Kil(int ,int );
 22 void JD(int ,int );
 23 void NMRQ(int );
 24 void WJQF(int );
 25 bool WXKJ(int ,int ,int );
 26 void JS(int ,int );
 27 int main()
 28 {
 29     Input();
 30     Work();
 31     Output();
 32     return 0;
 33 }
 34 void Input(){
 35     int i,j,k;
 36     scanf("%d%d",&n,&m);
 37     for(i=1;i<=n;i++)    nxt[i]=i+1,las[i]=i-1;
 38     nxt[n]=1,las[1]=n;
 39     for(i=1;i<=n;i++){
 40         for(j=1;j<2010;j++)    player[i].card[j]=U;
 41         scanf("%s",sss),player[i].typ=sss[0];
 42         for(j=1;j<=4;j++)    scanf("%s",sss),player[i].card[j]=sss[0];
 43         player[i].cardsiz=player[i].Hp=4;
 44         if(player[i].typ==F)    Fz++;
 45         player[i].eq=false;
 46     }
 47     for(i=2;i<=n;i++)    kn[i]=U;
 48     kn[1]=M;
 49     for(i=1;i<=m;i++)
 50         scanf("%s",sss),Car_p[m-i+1]=sss[0];
 51 }
 52 void Work(){
 53     int i,j,k;
 54     char cad;
 55     ed=true;
 56     if(Fz)    ed=false;
 57     if(ed)    return ;
 58     for(i=1;i;i=nxt[i]){
 59         get_card(i),get_card(i);
 60         bool kill=true;
 61         for(j=1;j<=player[i].cardsiz;j++)
 62             if(player[i].card[j]!=U){
 63                 if(!player[i].Hp)    break;
 64                 cad=player[i].card[j];
 65                 if(cad==P){
 66                     if(player[i].Hp!=4)
 67                         player[i].Hp++,player[i].card[j]=U;
 68                     continue;
 69                 }
 70                 if(cad==K){
 71                     if(!kill&&!player[i].eq)    continue;
 72                     if(player[i].typ==M&&kn[nxt[i]]!=L&&kn[nxt[i]]!=F)    continue;
 73                     if(player[i].typ==Z&&kn[nxt[i]]!=F)    continue;
 74                     if(player[i].typ==F&&kn[nxt[i]]!=Z&&kn[nxt[i]]!=M)    continue;
 75                     player[i].card[j]=U;
 76                     Kil(i,nxt[i]);
 77                     kn[i]=player[i].typ,kill=false;
 78                     if(ed)    return ;
 79                     continue;
 80                 }
 81                 if(cad==F){
 82                     if(player[i].typ==F){
 83                         player[i].card[j]=U,JD(i,1);
 84                         kn[i]=player[i].typ;
 85                         if(ed)    return ;
 86                         j=0;
 87                         continue;
 88                     }
 89                     for(k=nxt[i];k!=i;k=nxt[k])
 90                         if((player[i].typ==M&&(kn[k]==L||kn[k]==F))||(player[i].typ==Z&&kn[k]==F)){
 91                             player[i].card[j]=U,JD(i,k);
 92                             kn[i]=player[i].typ;
 93                             if(ed)    return ;
 94                             j=0;
 95                             break;
 96                         }
 97                     continue;
 98                 }
 99                 if(cad==N){
100                     player[i].card[j]=U;
101                     NMRQ(i);
102                     if(ed)    return ;
103                     j=0;
104                     continue;
105                 }
106                 if(cad==W){
107                     player[i].card[j]=U;
108                     WJQF(i);
109                     if(ed)    return ;
110                     j=0;
111                     continue;
112                 }
113                 if(cad==Z){
114                     player[i].eq=true;
115                     player[i].card[j]=U;
116                     j=0;
117                     continue;
118                 }
119             }
120     }
121 }
122 void Output(){
123     int i,j;
124     printf("%s",player[1].Hp<=0?"FP\n":"MP\n");
125     for(i=1;i<=n;i++){
126         if(player[i].Hp<=0)
127             printf("DEAD\n");
128         else{
129             for(j=1;j<=player[i].cardsiz;j++)
130                 if(player[i].card[j]!=U)
131                     printf("%c ",player[i].card[j]);
132             printf("\n");
133         }
134     }
135 }
136 void get_card(int x){
137     if(!m)    m++;
138     player[x].card[++player[x].cardsiz]=Car_p[m];
139     m--;
140 }
141 void Kil(int ker,int ked){
142     int i,j;
143     for(i=1;i<=player[ked].cardsiz;i++)
144         if(player[ked].card[i]==D){
145             player[ked].card[i]=U;
146             return ;
147         }
148     player[ked].Hp--;
149     if(!player[ked].Hp)    JS(ker,ked);
150 }
151 void JD(int fucker,int fucked){
152     int i,j,k;
153     if(WXKJ(fucker,fucked,1))    return ;
154     if(fucker==1&&player[fucked].typ==Z){
155         player[fucked].Hp--;
156         if(!player[fucked].Hp)    JS(fucker,fucked);
157         return ;
158     }
159     j=k=1;
160     while(1){
161         while(player[fucked].card[j]!=K&&j<=player[fucked].cardsiz)    j++;
162         if(j>player[fucked].cardsiz){
163             player[fucked].Hp--;
164             if(!player[fucked].Hp)    JS(fucker,fucked);
165             return ;
166         }
167         else
168             player[fucked].card[j]=U;
169         while(player[fucker].card[k]!=K&&k<=player[fucker].cardsiz)    k++;
170         if(k>player[fucker].cardsiz){
171             player[fucker].Hp--;
172             if(!player[fucker].Hp)    JS(fucked,fucker);
173             return ;
174         }
175         else
176             player[fucker].card[k]=U;
177     }
178 }
179 void NMRQ(int user){
180     int usto,i;
181     for(usto=nxt[user];usto!=user;usto=nxt[usto])
182         if(!WXKJ(user,usto,1)){
183             for(i=1;i<=player[usto].cardsiz;i++)
184                 if(player[usto].card[i]==K){
185                     player[usto].card[i]=U;
186                     break;
187                 }
188             if(i>player[usto].cardsiz){
189                 player[usto].Hp--;
190                 if(usto==1&&kn[user]==U)    kn[user]=L;
191                 if(!player[usto].Hp)    JS(user,usto);
192                 if(ed)    return ;
193             }
194         }
195 }
196 void WJQF(int user){
197     int usto,i;
198     for(usto=nxt[user];usto!=user;usto=nxt[usto])
199         if(!WXKJ(user,usto,1)){
200             for(i=1;i<=player[usto].cardsiz;i++)
201                 if(player[usto].card[i]==D){
202                     player[usto].card[i]=U;
203                     break;
204                 }
205             if(i>player[usto].cardsiz){
206                 player[usto].Hp--;
207                 if(usto==1&&kn[user]==U)    kn[user]=L;
208                 if(!player[usto].Hp)    JS(user,usto);
209                 if(ed)    return ;
210             }
211         }
212 }
213 bool WXKJ(int user,int usto,int fl){
214     int i=user,j,pd=fl?usto:user;
215     i=user;
216     while(1){
217         if(fl==1){
218             if(kn[usto]==player[i].typ||(kn[usto]==M&&player[i].typ==Z)||(kn[usto]==Z&&player[i].typ==M))
219                 for(j=1;j<=player[i].cardsiz;j++)
220                     if(player[i].card[j]==J){
221                         player[i].card[j]=U;
222                         kn[i]=player[i].typ;
223                         return !WXKJ(i,user,0);
224                     }
225         }
226         else{
227             if(((player[i].typ==M||player[i].typ==Z)&&kn[user]==F)||(player[i].typ==F&&(kn[user]==M||kn[user]==Z)))
228                 for(j=1;j<=player[i].cardsiz;j++)
229                     if(player[i].card[j]==J){
230                         player[i].card[j]=U;
231                         kn[i]=player[i].typ;
232                         return !WXKJ(i,user,0);
233                     }
234         }
235         i=nxt[i];
236         if(i==user)    break;
237     }
238     return false;
239 }
240 void JS(int ker,int ked){
241     int i;
242     for(i=1;i<=player[ked].cardsiz;i++)
243         if(player[ked].card[i]==P){
244             player[ked].card[i]=U;
245             player[ked].Hp++;
246             return ;
247         }
248     las[nxt[ked]]=las[ked];
249     nxt[las[ked]]=nxt[ked];
250     if(ked==1){
251         ed=true;
252         return ;
253     }
254     if(player[ked].typ==F)
255         Fz--;
256     if(!Fz){
257         ed=true;
258         return ;
259     }
260     if(player[ked].typ==F)
261         get_card(ker),get_card(ker),get_card(ker);
262     if(player[ked].typ==Z&&player[ker].typ==M)
263         player[ker].cardsiz=0,player[ker].eq=false;
264 }
View Code

 

以上是关于[SDOI2010]猪国杀的主要内容,如果未能解决你的问题,请参考以下文章

P2482 [SDOI2010] 猪国杀

Luogu2482 [SDOI2010]猪国杀

[Sdoi2010]猪国杀

[SDOI2010]猪国杀

洛谷P2482 [SDOI2010]猪国杀

[SDOI2010]猪国杀