代码:
#include<iostream>
#include<string>
using namespace std;
const int N=1e6+10;
bool over=false;
int n,m;
int pile[2050],top;
int jump_f[2000],f_top;
int jump_z[2000],z_top;
struct m{
char brand[N];//手牌
int hp;//血量
char attack;
string category;//种类*忠臣,反贼,主公
int source;//最后一次伤害来源
}pig[20];
int size(int pi){
for(int i=1;i<=N;i++){
if(pig[pi].brand[i]=='a'){
return i-1;
}
}
}
int touch(){//摸牌
if(top==0){
return pile[top];
}
else return pile[top--];
}
bool die(int pi){//判断猪是否死亡
if(pig[pi].hp==0) return true;
return false;
}
void discard(int pi){//判断死亡后猪的最后一次伤害是否要弃牌
if(pig[pi].category[1]=='M') over=true;
if(pig[pi].category[1]=='Z'){
for(int i=1;i<=n;i++){
if(pig[i].category[1]=='M'){
for(int j=1;j<=size(i);j++){
pig[i].brand[j]='a';
}
}
}
}
else if(pig[pi].category[1]=='F'){
pig[pig[pi].source].brand[size(pig[pi].source)+1]=touch();
pig[pig[pi].source].brand[size(pig[pi].source)+1]=touch();
pig[pig[pi].source].brand[size(pig[pi].source)+1]=touch();
}
}
void infer(){//判断跳反猪 or 类反猪 ,反正最后都要被MP表敌
for(int i=1;i<=n;i++){
if(pig[i].category[0]=='M' and pig[i].category[1]=='P'){
jump_f[f_top++]=pig[i].source;
}
}
}
bool decide(int pi){//pi表示对哪个猪使用 无懈可击
if(pig[pi].category[1]=='M' or pig[pi].category[1]=='Z'){
for(int i=1;i<=f_top;i++){
if(jump_f[i]==pi) return false;
}
return true;
}
else{
for(int i=1;i<=f_top;i++){
if(jump_f[i]==pi) return true;
}
return false;
}
}
//无懈可击,暂时不修
bool invulnerable(char armoury,int pi){//无懈可击
if(armoury=='l'){//决斗
infer();//推理一波
if(decide(pi)) return true;//判断是否打出无懈击
return false;
}
if(armoury=='n'){//南蛮入侵
infer(); //判断一下跳忠跳反猪
if(decide(pi)) return true;//判断是否打出无懈可击
return false;
}
if(armoury=='y'){//万箭齐发
infer();//参上
if(decide(pi)) return true;//判断是否打出无懈
return false;
}
}
void intrusion(int pi){//南蛮入侵
int hhp;
for(int i=1;i<=n;i++){
invulnerable('n',pi);//无懈可击询问
if(i!=pi){
for(int j=1;j<=size(i);j++){
if(pig[i].brand[j]=='K'){//有杀打出
hhp=1;
break;
}
}
if(hhp==0) pig[i].hp--,pig[i].source=pi;
}
}
}
void volley(int pi){//万箭齐发
int hhp;
for(int i=1;i<=n;i++){
invulnerable('y',pi);//无懈可击询问
if(i!=pi){
for(int j=1;j<=size(i);j++){
if(pig[i].brand[j]=='D'){
pig[i].brand[i]='a';//有闪打出
hhp=1;
break;
}
}
if(hhp==0) pig[i].hp--,pig[i].source=pi;
}
}
}
void duel(int pi,int pig_2){//决斗
while(!decide(pig_2)) pig_2--;
if(!invulnerable('l',pi)){//无懈可击询问
return ;
}
}
bool dodge(int who){//闪
for(int i=1;i<=size(who);i++){
if(pig[who].brand[i]=='D'){
return true;
}
}
return false;
}
void kill(int who,int pi){//杀
if(dodge(who)) return ;//有闪
else pig[who].hp--;//没闪
if(pig[pi].attack=='Z'){
for(int i=1;i<=size(pi);i++){
}
}
}
void peach(int pi){//桃
if(pig[pi].hp!=4){
for(int i=1;i<=size(pi);i++){
if(pig[i].brand[i]=='P'){
pig[i].brand[i]='a';
}
}
}
}
void equip(int pi){//装备
if(size(pi)=='Z'){
pig[pi].brand[size(pi)]='a';
pig[pi].source='Z';
}
}
int main(){
scanf("%d%d",&n,&m);
top=m;
for(int i=1;i<=n;i++){
printf("%s%s",&pig[i].category[1],&pig[i].category[2]);
scanf("%c %c %c %c",&pig[i].brand[1],&pig[i].brand[2],&pig[i].brand[2],&pig[i].brand[3],&pig[i].brand[4]);
}
//for(int i=1;i<=m;i++) scanf("%d",&pile[i]);
for(int i=1;i<=1;i++){
for(int j=size(i);j>=1;j++){
if(pig[i].brand[j]=='K') kill(i-1,i);
if(pig[i].brand[j]=='P') peach(i);
if(pig[i].brand[j]=='Z') equip(i);
if(pig[i].brand[j]=='N') intrusion(i);
if(pig[i].brand[j]=='W') volley(i);
if(pig[i].brand[j]=='F') duel(i,i-1);
}
}
for(int i=2;i<=n;i++){
if(die(i)){
discard(i);
continue;
}
for(int j=size(i);j>=1;j++){
if(pig[i].brand[j]=='K') kill(i-1,i);
if(pig[i].brand[j]=='P') peach(i);
if(pig[i].brand[j]=='Z') equip(i);
if(pig[i].brand[j]=='N') intrusion(i);
if(pig[i].brand[j]=='W') volley(i);
if(pig[i].brand[j]=='F') duel(i,i-1);
}
}
if(over) printf("FP \n");
else printf("MP \n ");
for(int i=1;i<=n;i++){
if(die(i)) printf("DEAD \n");
else{
printf("%s%s \n",pig[i].category[1],pig[i].category[2]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=size(i);j++){
if(pig[i].brand[j]!='a'){
printf("%c ",pig[i].brand[j]);
}
}
}
return 0;
}
有注释,应该很好懂