读入有问题,全WA,估计算法有点问题,有注释,求调,悬2关

P2482 [SDOI2010] 猪国杀

``` #include<bits/stdc++.h> #define LL long long #define register #define inline #define INF 0x3f3f3f3f using namespace std; inline void Read(int &x){ int f=1; char c=getchar(); x=0; while(c<'0'||c>'9'){ if(c=='-')f=-1; c=getchar(); } while(c>='0'&&c<='9'){ x=(x<<3)+(x<<1)+c-'0'; c=getchar(); } x*=f; } int n,m; struct Pig { bool Weapon;//是否装备武器 char Card[2010];//当前卡牌 PKDFNWJZU char Id;//身份 MZF int Cards;//卡牌数量 int HP;//生命值 int lst,nxt;//前驱后继 }p[20]; bool GameOver;//游戏结束 char AllCards[2010];//牌堆 char Seem[20];//MP眼中的身份 MZFUL int FP;//反猪数量 void Get(int now){//摸牌 if(!m)m++; p[now].Card[++p[now].Cards]=AllCards[m--]; } void Dead(int now,int killer){//处理濒死状态的猪 for(int i=1;i<=p[now].Cards;i++){//如果吃桃能活过来就吃 if(p[now].Card[i]=='P'){ p[now].Card[i]='U',p[now].HP++; return; } } p[p[now].lst].nxt=p[now].nxt;//处理相邻关系 p[p[now].nxt].lst=p[now].lst; if(now==1){//MP死了游戏结束 GameOver=1; return; } if(p[now].Id=='F')FP--;//FP死了要统计 if(!FP){//没有FP游戏结束 GameOver=1; return; } if(p[now].Id=='F'){//杀死FP摸三张牌 Get(killer),Get(killer),Get(killer); } if(p[now].Id=='Z'&&p[killer].Id=='M'){//MP杀ZP要弃牌 p[killer].Cards=0,p[killer].Weapon=0; } } void Jump(int now){//跳忠/跳反 Seem[now]=p[now].Id; } void K(int now,int to){//使用【杀】 for(int i=1;i<=p[to].Cards;i++){ if(p[to].Card[i]=='D'){//有【闪】就弃置 p[to].Card[i]='U'; return; } } p[to].HP--;//我大意了啊,没有闪 if(!p[to].HP)Dead(to,now); } #define Unsuccessful 0 bool J(int now,int to,int opt){//使用【无懈可击】 //opt==0:now无懈掉to的无懈 //opt==1:now无懈掉打到to的锦囊牌 int i=now; while(1){ if(opt==1){ //同伙,帮助无懈掉 if(Seem[to]==p[i].Id||(Seem[to]=='M'&&p[i].Id=='Z')||(Seem[to]=='Z'&&p[i].Id=='M')){ for(int j=1;j<=p[i].Cards;j++){ if(p[i].Card[j]=='J'){ p[i].Card[j]='U'; Jump(i); return !J(i,now,0);//i是否无懈成功 } } } }else { //敌人,无懈掉他的无懈 if(((p[i].Id=='M'||p[i].Id=='Z')&&Seem[now]=='F')||(p[i].Id=='F'&&(Seem[now]=='M'||Seem[now]=='Z'))){ for(int j=1;j<=p[i].Cards;j++){ if(p[i].Card[j]=='J'){ p[i].Card[j]='U'; Jump(i); return !J(i,now,0);//i是否无懈成功 } } } } i=p[i].nxt; if(i==now)break; } return Unsuccessful;//无懈失败 } #undef Unsuccessful void N(int now){//使用【南猪入侵】 for(int to=p[now].nxt;to!=now;to=p[to].nxt){//寻找目标 if(!J(now,to,1)){//没有被无懈 int i; for(i=1;i<=p[to].Cards;i++){//需要弃置【杀】 if(p[to].Card[i]=='K'){ p[to].Card[i]='U'; break; } } if(i>p[to].Cards){//防御失败 p[to].HP--; if(to==1&&Seem[now]=='U')Seem[now]='L';//打到MP,变成类反猪 if(!p[to].HP)Dead(to,now); if(GameOver)return; } } } } void W(int now){//使用【万箭齐发】 for(int to=p[now].nxt;to!=now;to=p[to].nxt){//以下同【南猪入侵】 if(!J(now,to,1)){ int i; for(i=1;i<=p[to].Cards;i++){ if(p[to].Card[i]=='D'){//不同的是要弃置【闪】 p[to].Card[i]='U'; break; } } if(i>p[to].Cards){ p[to].HP--; if(to==1&&Seem[now]=='U')Seem[now]='L'; if(!p[to].HP)Dead(to,now); if(GameOver)return; } } } } void F(int now,int to){//使用【决斗】 if(J(now,to,1))return; if(now==1&&p[to].Id=='Z'){//特殊情况:MP对ZP,ZP必输 p[to].HP--; if(!p[to].HP)Dead(to,now); return; } int i=1,j=1;//遍历两人手牌的指针 while(1){ while(p[to].Card[i]!='K'&&i<=p[to].Cards)i++;//从对手开始轮流弃置【杀】 if(i>p[to].Cards){//没有【杀】的一方输 p[to].HP--; if(!p[to].HP)Dead(to,now); return; }else p[to].Card[i]='U'; while(p[now].Card[j]!='K'&&j<=p[now].Cards)j++; if(j>p[now].Cards){ p[now].HP--; if(!p[now].HP)Dead(now,to); return; }else p[now].Card[j]='U'; } } void StartRound(){//开始游戏 GameOver=1; if(FP)GameOver=0; if(GameOver)return; for(int i=1;i;i=p[i].nxt){ Get(i),Get(i);//每个人摸两张牌 bool can_use_kill=1;//用【杀】的机会 for(int j=1;j<=p[i].Cards;j++){ if(p[i].Card[j]!='U'){ if(!p[i].HP)break; char now=p[i].Card[j]; if(now=='P'){//使用【桃】 if(p[i].HP!=4)p[i].HP++,p[i].Card[j]='U'; continue; } if(now=='K'){//使用【杀】 if(!can_use_kill&&!p[i].Weapon)continue;//用过了且没有武器 if(p[i].Id=='M'&&Seem[p[i].nxt]!='F'&&Seem[p[i].nxt]!='L')continue;//MP只打FP和LP if(p[i].Id=='Z'&&Seem[p[i].nxt]!='F')continue;//ZP只打FP if(p[i].Id=='F'&&Seem[p[i].nxt]!='M'&&Seem[p[i].nxt]!='Z')continue;//FP只打MP和ZP p[i].Card[j]='U'; K(i,p[i].nxt); Jump(i),can_use_kill=0; if(GameOver)return; continue; } if(now=='F'){//使用【决斗】 if(p[i].Id=='F'){//FP一定打MP p[i].Card[j]='U'; F(i,1); Jump(i); if(GameOver)return; j=0; continue; } for(int k=p[i].nxt;k!=i;k=p[k].nxt){//否则找决斗目标FP或LP if((p[i].Id=='M'&&(Seem[k]=='F'||Seem[k]=='L'))||(p[i].Id=='Z'&&Seem[k]=='F')){ p[i].Card[j]='U',F(i,k); Jump(i); if(GameOver)return; j=0; break; } } } if(now=='N'){//使用【南猪入侵】 p[i].Card[j]='U'; N(i); if(GameOver)return; j=0; continue; } if(now=='W'){//使用【万箭齐发】 p[i].Card[j]='U'; W(i); if(GameOver)return; j=0; continue; } if(now=='Z'){//使用【猪哥连弩】 p[i].Card[j]='U'; p[i].Weapon=1; j=0; continue; } } } } } int main(){ Read(n),Read(m); for(int i=1;i<=n;i++)p[i].lst=i-1,p[i].nxt=i+1;//初始化攻击距离 p[1].lst=n,p[n].nxt=1; for(int i=1;i<=n;i++){ for(int j=1;j<2010;j++)p[i].Card[j]='U';//初始化手牌 p[i].Cards=p[i].HP=4;//初始化HP和手牌数 p[i].Weapon=0;//初始化武器 Seem[i]='U';//初始化表现出的身份 char ipt[5];scanf("%s",ipt);//输入身份 p[i].Id=ipt[0]; for(int j=1;j<=4;j++)scanf("%s",ipt),p[i].Card[j]=ipt[0];//输入手牌 if(p[i].Id=='F')FP++;//统计FP } Seem[1]='M'; for(int i=1;i<=m;i++){//输入卡牌堆 char ipt[5];scanf("%s",ipt); AllCards[m-i+1]=ipt[0]; } StartRound();//开始游戏! if(p[1].HP<=0)cout<<"FP\n";//MP死了FP胜 else cout<<"MP\n";//否则MP胜 for(int i=1;i<=n;i++){//输出最终信息 if(p[i].HP<=0)cout<<"DEAD\n"; else { for(int j=1;j<=p[i].Cards;j++){ if(p[i].Card[j]!='U')cout<<p[i].Card[j]<<" "; } cout<<endl; } } return 0; } ```
by Leo2525 @ 2023-08-21 15:54:54


@[Leo2525](/user/983112) 谢谢,没注意看到
by only__one @ 2023-08-29 14:53:27


@[Leo2525](/user/983112) 我说我现在才想起来我悬关你信吗
by only__one @ 2023-10-05 12:41:35


e
by Leo2525 @ 2023-10-05 16:08:25


|