原题题面
防止本宝宝突然……
决定实时更新到cnblog上
或者说,请个大佬斧正
#include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<cstring> using namespace std; struct pig{ int pupil;//表示猪型,-1反,0主,1忠。 char paid[110];//表示手牌。 int num_paid;//表示现持有的牌数。 void dust_paid()//整理手牌 { int cnt=0; for(int i=1;i<=num_paid;i++) if(paid[i]!=0) paid[++cnt]=paid[i]; return ; } int alive;//剩余血量。 int jump;//-1 跳反,0未跳,1跳忠。 bool like_enemy;//是否为类反猪。 bool equip;//是否装备诸葛连弩。 // int num_kill;//杀 int num_dodge;//闪 // int num_fight;//决斗 // int num_peach;//桃 int num_none;//无懈可击 数量 int alive_before;//前一头活着的猪 int alive_next;//下一头活着的猪 void debug() { printf("class: %d Hp: %d num_paid: %d \n",pupil,alive,num_paid); printf("手牌:\n "); for(int i=1;i<=num_paid;i++) printf("%c ",paid[i]); printf("\n跳反(-1反,0无,1忠): %d \n类反猪: %d \n武器: %d \n",jump,like_enemy,equip); printf("无懈可击数: %d \n闪数: %d \n",num_none,num_dodge); printf("上家: %d 下家: %d \n",alive_before,alive_next); return ; } }pig[110]; int n,m; char opt; int mp;//主猪编号. int num_f;//反猪个数。 char pid[10010]; int num_pid;//目前抽到哪张牌? void start()//开始 { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { pig[i].alive=4; scanf("%c%c",&opt,&opt); // printf("%c ",opt); if(opt=='M') pig[i].pupil=0,mp=i; else if(opt=='Z') pig[i].pupil=1; else if(opt=='F') pig[i].pupil=-1,num_f++; // printf("%d ",pig[i].pupil); scanf("%c",&opt); for(int j=1;j<=4;j++) { scanf("%c%c",&opt,&opt); // printf("%c ",opt); pig[i].paid[++pig[i].num_paid]=opt; if(opt=='J') pig[i].num_none++; else if(opt=='D') pig[i].num_dodge++; } pig[i].alive_before=i-1; pig[i].alive_next=i+1; // puts(""); } pig[1].alive_before=n; pig[n].alive_next=1; for(int i=1;i<=m;i++) scanf("%c%c",&opt,&opt),pid[i]=opt; // for(int i=1;i<=m;i++) printf("%c ",opt); // puts(""); return ; } bool end()//判断是否结束。 { if(num_f==0){puts("MP");return true;} else if(pig[mp].alive==0) {puts("FP");return true;} return false; } void print_ans()//输出结果。 { for(int i=1;i<=n;i++,puts("")) { if(pig[i].alive==0) {printf("DEAD");continue;} pig[i].dust_paid(); for(int j=1;j<=pig[i].num_paid;j++) printf("%c ",pig[i].paid[j]); } return ; } void get_card(int i)//第i只猪摸牌。 { pig[i].paid[++pig[i].num_paid]=num_pid==m?pid[m]:pid[++num_pid]; pig[i].paid[++pig[i].num_paid]=num_pid==m?pid[m]:pid[++num_pid]; return ; } void action(int x)//第i只猪开始行动 { bool attack=false; if(!pig[x].alive) return ; get_card(x); for(int i=1;i=pig[i].num_paid;i++) { int ch=pig[x].paid[i]; if(ch==0) continue; //如果是空牌就过。 else if(pig[x].alive<4&&pig[x].paid[i]=='P') pig[x].paid[i]=0,pig[x].alive++; //如果血量没满且有桃。 else if(pig[x].paid[i]=='Z') pig[x].equip=true,pig[x].paid[i]=0,i=1; //如果是诸葛连弩,装上,从头扫。 else if(pig[x].paid[i]=='D') continue; //如果是闪就过。 else if(pig[x].paid[i]=='K') //如果是杀,且有第一击杀目标。 { //判断能不能杀。 if(!pig[x].equip) { } } } } int main() { start(); // for(int i=1;i<=n;i++,puts(""),puts("")) // printf("%d:\n",i),pig[i].debug(); // printf("牌堆:\n "); // for(int i=1;i<=m;i++) printf("%c ",pid[i]); return 0; } /* 3 10 MP D D F F ZP N N N D FP J J J J F F D D J J F F K D */