bzoj1972 SDOI2010-----猪国杀(模拟)
题目自己去找吧
记得数据范围是<=10
注意事项:
1.牌库空的时候,要不断的抽第一张牌
2.反贼的决斗永远是向主公发的
3.每次判定无懈的时候,都是从使用锦囊的那个牌开始,记得敌意和殷勤的判断
4.只能向有身份的人无懈可击
5.有装备就装
#include<iostre am>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<map>
#include<queue>
#include<vector>
using namespace std;
inline int read()
{
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
return x*f;
}
struct pig{
char a[100000];
int tot;
int blood;
int num;
int nxt;
int shan;
int sha;
int tao;
int wu;
int pre;
int biao;//0 啥也没有 1类反 2表反 3表忠
int shenfen;//1主公,2忠臣,3反贼
int nanman,wanjian,zhuge,jd;
bool dead;
bool weapon;
int atk;
};
pig a[15];
int n,m;
char paiku[2010];
int top;
int fanzei;
int start;
void clear(int now,char p,int num)
{
for (int i=1;i<=a[now].tot;i++)
{
if (!num) break;
if (a[now].a[i]==p) num--,a[now].a[i]='*';
}
}
int judge()
{
int fz=0;
for (int i=1;i<=n;i++)
{
if (a[i].dead && a[i].shenfen==3) fz++;
if (a[i].dead && a[i].shenfen==1) return 1;
}
if (fz==fanzei) return 2;
else return 0;
}
void biaoyinqin(int now,int to)
{
if (now==to) return;
if (a[now].shenfen!=1)
{
if (a[to].shenfen==1) a[now].biao=3;
else
{
if (a[to].shenfen==1) a[now].biao=3;
if (a[to].biao==2) a[now].biao=2;
if (a[to].biao==3) a[now].biao=3;
}
}
}
void biaodiyi(int now,int to)
{
if (now==to) return;
if (a[now].shenfen!=1)
{
if (a[to].shenfen==1) a[now].biao=2;
else
{
if (a[to].biao==2) a[now].biao=3;
if (a[to].biao==3) a[now].biao=2;
}
}
}
void mopai(int num,int tot)
{
while (tot>0)
{
a[num].a[++a[num].tot]=paiku[top];
if (paiku[top]=='P') a[num].tao++;
if (paiku[top]=='K') a[num].sha++;
if (paiku[top]=='D') a[num].shan++;
if (paiku[top]=='J') a[num].wu++;
if (paiku[top]=='F') a[num].jd++;
if (paiku[top]=='N') a[num].nanman++;
if (paiku[top]=='W') a[num].wanjian++;
if (paiku[top]=='Z') a[num].zhuge++;
top=max(top-1,1);
tot--;
}
}
bool peach(int now,int to)
{
if (a[now].tao>0 && a[to].blood<4)
{
a[to].blood++;
a[now].tao--;
clear(now,'P',1);
return true;
}
return false;
}
void death(int now,int to)
{
a[to].dead=true;
if (judge()) return;
a[a[to].pre].nxt=a[to].nxt;
a[a[to].nxt].pre=a[to].pre;
if (a[now].shenfen==1 && a[to].shenfen==2)
{
a[now].weapon=false;
for (int i=1;i<=a[now].tot;i++) a[now].a[i]='*';
a[now].sha=a[now].shan=a[now].wu=a[now].tao=a[now].nanman=a[now].wanjian=a[now].jd=a[now].zhuge=0;
}
else
{
if (a[to].shenfen==3) mopai(now,3);
}
a[to].weapon=false;
for (int i=1;i<=a[to].tot;i++) a[to].a[i]='*';
a[to].sha=a[to].shan=a[to].wu=a[to].tao=a[to].nanman=a[to].wanjian=a[to].jd=a[to].zhuge=0;
a[to].dead=true;
}
void damage(int now,int to)
{
a[to].blood--;
if (a[to].blood!=0) return;
if (!peach(to,to))
{
if (judge()) return;
death(now,to);
}
}
void sha(int now,int to)
{
biaodiyi(now,to);
a[now].sha--;
clear(now,'K',1);
if (a[to].shan==0) damage(now,to);
else
a[to].shan--,clear(to,'D',1);
}
bool gg(int now)
{
bool flag=false;
if ((a[now].biao==0 || a[now].biao==1 ) && a[now].shenfen!=1) return false;
int pos = a[now].nxt;
if (!flag)
{
while (pos!=now)
{
if (a[pos].wu>0 && ((a[now].shenfen==1 && a[pos].shenfen==3) ||(a[now].biao==3 && a[pos].shenfen==3)|| (a[now].biao==2 && a[pos].shenfen==2)|| (a[now].biao==2 && a[pos].shenfen==1)))
{
flag=true;
a[pos].wu--;
clear(pos,'J',1);
biaodiyi(pos,now);
break;
}
pos=a[pos].nxt;
}
}
if (flag) return !gg(pos);
return false;
}
bool wuxie(int now,int st)
{
bool flag=false;
if ((a[now].biao==0 || a[now].biao==1 ) && a[now].shenfen!=1) return false;
if (a[st].wu>0 && ((a[now].shenfen==1 && a[st].shenfen==2) ||(a[now].biao==2 && a[st].shenfen==3) || (a[now].biao==3 && a[st].shenfen==2) || (a[now].biao==3 && a[st].shenfen==1)||(a[now].shenfen==1 && a[st].shenfen==1)))
{
flag=true;
a[st].wu--;
biaoyinqin(st,now);
clear(st,'J',1);
}
int pos =st;
if (!flag)
{
pos=a[st].nxt;
while (pos!=st)
{
if (pos!=now)
{
if (a[pos].wu>0 && ((a[now].shenfen==1 && a[pos].shenfen==2) ||(a[now].biao==2 && a[pos].shenfen==3) || (a[now].biao==3 && a[pos].shenfen==2) || (a[now].biao==3 && a[pos].shenfen==1)))
{
flag=true;
a[pos].wu--;
clear(pos,'J',1);
biaoyinqin(pos,now);
break;
}
}
else
{
if ((a[pos].biao!=0 && a[pos].biao!=1) || a[pos].shenfen==1)
{
if (a[pos].wu>0)
{
flag=true;
a[pos].wu--;
clear(pos,'J',1);
break;
}
}
}
pos=a[pos].nxt;
}
}
if (flag) return !gg(pos);
return false;
}
void juedou(int now,int to)
{
biaodiyi(now,to);
a[now].jd--;
clear(now,'F',1);
if (a[now].shenfen==1 && a[to].shenfen==2)
{
a[to].blood--;
if (a[to].blood!=0) return;
if (!peach(to,to)) a[to].dead=true,death(now,to);
}
else
{
if (!wuxie(to,now))
{
int min1=min(a[now].sha,a[to].sha);
a[now].sha-=min1;a[to].sha-=min1;
clear(now,'K',min1);
clear(to,'K',min1);
if (a[to].sha==0)
{
damage(now,to);
}
else
{
a[to].sha--;
clear(to,'K',1);
damage(to,now);
}
}
}
}
void nanmanruqin(int now)
{
a[now].nanman--;
clear(now,'N',1);
int pos = a[now].nxt;
while (pos!=now)
{
if (!wuxie(pos,now))
{
if (a[pos].sha>0)
{
a[pos].sha--,clear(pos,'K',1);
}
else
{
damage(now,pos);
if (a[pos].shenfen==1 && !a[now].biao) a[now].biao=1;
}
}
if (judge()) return;
pos=a[pos].nxt;
}
}
void wanjianqifa(int now)
{
a[now].wanjian--;
clear(now,'W',1);
int pos = a[now].nxt;
while (pos!=now)
{
if (!wuxie(pos,now))
{
if (a[pos].shan>0)
a[pos].shan--,clear(pos,'D',1);
else
{
damage(now,pos);
if (a[pos].shenfen==1 && !a[now].biao) a[now].biao=1;
}
}
if (judge()) return;
pos=a[pos].nxt;
}
}
int find(int now)
{
int pos = a[now].nxt;
while (a[pos].biao!=1 && a[pos].biao!=2 && pos!=now)
{
pos=a[pos].nxt;
}
if (pos==now) return 0;
else return pos;
}
int find1(int now)
{
int pos = a[now].nxt;
while (a[pos].biao!=2 && pos!=now)
{
pos=a[pos].nxt;
}
if (pos==now) return 0;
else return pos;
}
void print()
{
if (judge()==1)
{
cout<<"FP"<<endl;
}
else
cout<<"MP"<<endl;
for (int i=1;i<=n;i++)
{
if (a[i].dead)
{
printf("DEAD\n");
}
else
{
for (int j=1;j<=a[i].tot;j++)
{
if (a[i].a[j]!='*')
cout<<a[i].a[j]<<" ";
}
cout<<"\n";
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++)
{
a[i].blood=4;
char s[10];
scanf("%s",s+1);
if (s[1]=='M') a[i].shenfen=1,start=i;
if (s[1]=='Z') a[i].shenfen=2;
if (s[1]=='F') a[i].shenfen=3,fanzei++;
for (int j=1;j<=4;j++)
{
scanf("%s",s+1);
if (s[1]=='P') a[i].tao++;
if (s[1]=='K') a[i].sha++;
if (s[1]=='D') a[i].shan++;
if (s[1]=='J') a[i].wu++;
if (s[1]=='F') a[i].jd++;
if (s[1]=='N') a[i].nanman++;
if (s[1]=='W') a[i].wanjian++;
if (s[1]=='Z') a[i].zhuge++;
a[i].a[j]=s[1];
a[i].tot++;
}
}
top=m;
for (int i=1;i<=m;i++)
{
char s[10];
scanf("%s",s+1);
paiku[m-i+1]=s[1];
}
for (int i=1;i<=n-1;i++) a[i].nxt=i+1;
a[n].nxt=1;
for (int i=2;i<=n;i++) a[i].pre=i-1;
a[1].pre=n;
int now = 1;
while (!judge())
{
mopai(now,2);
bool flag=false;
for (int i=1;i<=a[now].tot;i++)
{
if (a[now].dead) break;
int mubiao=0;
if (a[now].shenfen==1)
{
mubiao=find(now);
}
if (a[now].shenfen==2)
{
mubiao=find1(now);
}
if (a[now].a[i]!='*')
{
if (a[now].a[i]=='K')
{
if ((a[now].weapon) || (!flag))
{
if ((a[now].shenfen==1 && a[a[now].nxt].biao==1) || (a[now].shenfen==1 && a[a[now].nxt].biao==2) || (a[now].shenfen==2 && a[a[now].nxt].biao==2) ||(a[now].shenfen==3 && a[a[now].nxt].shenfen==1) || (a[now].shenfen==3 && a[a[now].nxt].biao==3))
{
if (a[now].sha)
{
sha(now,a[now].nxt);
if (judge())
{
print();
return 0;
}
i=0;
flag=true;
}
}
}
}
if (a[now].a[i]=='P')
{
if (a[now].blood<4) peach(now,now),i=0;
}
if (a[now].a[i]=='F')
{
if (a[now].shenfen==1) {
if (mubiao)
{
juedou(now,mubiao);
i=0;
}
}
if (a[now].shenfen==2) {
if (mubiao)
{
juedou(now,mubiao);
i=0;
}
}
if (a[now].shenfen==3) {
juedou(now,start),i=0;
}
if (judge())
{
print();
return 0;
}
}
if (a[now].a[i]=='N')
{
nanmanruqin(now),i=0;
if (judge())
{
print();
return 0;
}
}
if (a[now].a[i]=='W')
{
wanjianqifa(now),i=0;
if (judge())
{
print();
return 0;
}
}
if (a[now].a[i]=='Z')
{
a[now].weapon=true,a[now].a[i]='*',i=0;
a[now].zhuge--;
if (judge())
{
print();
return 0;
}
}
}
}
now = a[now].nxt;
}
if (judge()==1)
{
cout<<"FP"<<endl;
}
else
cout<<"MP"<<endl;
for (int i=1;i<=n;i++)
{
if (a[i].dead)
{
printf("DEAD\n");
}
else
{
for (int j=1;j<=a[i].tot;j++)
{
if (a[i].a[j]!='*')
cout<<a[i].a[j]<<" ";
}
cout<<"\n";
}
}
return 0;
}