社区讨论
只A了#4#5,求调,其他全RE
P2482[SDOI2010] 猪国杀参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mdle2tiu
- 此快照首次捕获于
- 2025/07/27 16:00 7 个月前
- 此快照最后确认于
- 2025/07/27 20:42 7 个月前
在猪国杀(超多样例调试版)里的所有样例本地都跑过了,但交上去全RE,只A了两个点10分
CPP#include<bits/stdc++.h>
#define int int
#define rep(i,x,y) for(register int i=x;i<=y;++i)
#define ref(i,x,y) for(register int i=x;i>=y;--i)
#define rek(i,x,y) for(register int i=x;i<y;++i)
using namespace std;
#define endl '\n'
int T,n,m,cnt;
int mu_biao;
int ren_shu;
int lun_dao;
int shang_shai;
int fan_zhu_shu_liang;
char pai_dui[2005];
/*
tao P
sha K
shan D
jue_dou F
wu_xie_ke_ji J
nan_zhu_ru_qin N
wan_jian_qi_fa W
zhu_ge_lian_nu Z
*/
struct Pig
{
int left;
int right;
int xue_liang;
bool tiao_fan;
bool tiao_zhong;
bool lei_fan_zhu;
bool zhu_ge_lian_nu;
bool si_wang_pan_duan;
string shen_fen;
vector<char> shou_pai;
Pig(){xue_liang=4,zhu_ge_lian_nu=si_wang_pan_duan=tiao_zhong=tiao_fan=0;}
};
Pig p[15];
void game_over()
{
if(p[1].si_wang_pan_duan)
{
cout<<"FP\n";
rep(i,1,n)
{
if(p[i].si_wang_pan_duan) cout<<"DEAD";
else for(auto v:p[i].shou_pai) cout<<v<<" ";
cout<<'\n';
}
}
else
{
cout<<"MP\n";
rep(i,1,n)
{
if(p[i].si_wang_pan_duan) cout<<"DEAD";
else for(auto v:p[i].shou_pai) cout<<v<<" ";
cout<<'\n';
}
}
exit(0);
}
void zhu_ge_lian_nu(int x)
{
p[x].zhu_ge_lian_nu=1;
// cout<<x<<"-->诸葛连弩\n";
}
void si_wang(int x,int lai_yuan)
{
// cout<<x<<"阵亡,是"<<lai_yuan<<"杀的\n";
p[x].si_wang_pan_duan=1;
if(p[x].shen_fen=="MP") game_over();
if(p[x].shen_fen=="FP")
{
fan_zhu_shu_liang--;
if(fan_zhu_shu_liang==0) game_over();
// cout<<lai_yuan<<"击杀反贼,摸三张牌\n";
// cout<<lai_yuan<<"摸到"<<pai_dui[cnt+1]<<'\n';
p[lai_yuan].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
// cout<<lai_yuan<<"摸到"<<pai_dui[cnt+1]<<'\n';
p[lai_yuan].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
// cout<<lai_yuan<<"摸到"<<pai_dui[cnt+1]<<'\n';
p[lai_yuan].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
}
if(p[x].shen_fen=="ZP"&&p[lai_yuan].shen_fen=="MP")
{
// cout<<"主公击杀忠臣,弃置所有手牌\n";
while(p[lai_yuan].shou_pai.size()>0) p[lai_yuan].shou_pai.pop_back();
p[lai_yuan].zhu_ge_lian_nu=0;
}
int l=p[x].left,r=p[x].right;
p[l].right=r,p[r].left=l,p[x].si_wang_pan_duan=1;
return;
}
void shou_shang(int x,int lai_yuan)
{
--p[x].xue_liang;
// cout<<x<<"受伤,来源是"<<lai_yuan<<",血量"<<p[x].xue_liang+1<<"-->"<<p[x].xue_liang<<"\n";
if(p[x].xue_liang==0)
{
int flag=1;
rek(i,0,p[x].shou_pai.size())
{
int pai=p[x].shou_pai[i];
if(pai=='P')
{
// cout<<x<<"吃了一颗桃,血量"<<p[x].xue_liang<<"-->"<<p[x].xue_liang+1<<"\n";
flag=0,p[x].shou_pai.erase(p[x].shou_pai.begin()+i);
break;
}
}
if(flag) si_wang(x,lai_yuan);
else ++p[x].xue_liang;
}
return;
}
bool you_wu_xie_ke_ji(int x)
{
rek(i,0,p[x].shou_pai.size())
{
int pai=p[x].shou_pai[i];
if(pai=='J') return 1;
}
return 0;
}
bool chu_wu_xie_ke_ji(int x)
{
rek(i,0,p[x].shou_pai.size())
{
int pai=p[x].shou_pai[i];
if(pai=='J') return p[x].shou_pai.erase(p[x].shou_pai.begin()+i),1;
}
return 0;
}
bool wu_xie_ke_ji(int x,int zhuang_tai,int lai_yuan)
{
int flagggg=1;
rep(i,1,n) if(you_wu_xie_ke_ji(i)) flagggg=0;
if(flagggg) return zhuang_tai;
int k=lai_yuan,flag=0;
while(k!=lai_yuan||flag==0)
{
if(k==lai_yuan&&flag==1) break;
if(!you_wu_xie_ke_ji(k)||p[k].si_wang_pan_duan)
{
k=p[k].right,flag=1;
continue;
}
if(p[x].tiao_zhong&&(p[k].shen_fen=="ZP"||p[k].shen_fen=="MP")&&zhuang_tai==1||p[x].tiao_fan&&p[k].shen_fen=="FP"&&zhuang_tai==1||p[x].tiao_fan&&(p[k].shen_fen=="ZP"||p[k].shen_fen=="MP")&&zhuang_tai==0||p[x].tiao_zhong&&p[k].shen_fen=="FP"&&zhuang_tai==0||p[x].lei_fan_zhu&&p[k].shen_fen=="MP"&&zhuang_tai==0) break;
k=p[k].right,flag=1;
}
if(k!=lai_yuan||(k==lai_yuan&&flag==0))
{
// cout<<k<<"使用了一张无懈可击\n";
if(zhuang_tai)
{
if(p[x].tiao_zhong)
{
p[k].tiao_zhong=1,p[k].tiao_fan=p[k].lei_fan_zhu=0;
// cout<<k<<"跳忠\n";
}
if(p[x].tiao_fan)
{
p[k].tiao_fan=1;
// cout<<k<<"跳反\n";
}
}
else
{
if(p[x].tiao_zhong)
{
p[k].tiao_fan=1;
// cout<<k<<"跳反\n";
}
if(p[x].tiao_fan)
{
p[k].tiao_zhong=1,p[k].tiao_fan=p[k].lei_fan_zhu=0;
// cout<<k<<"跳忠\n";
}
}
chu_wu_xie_ke_ji(k);
return wu_xie_ke_ji(x,!zhuang_tai,k);
}
else return zhuang_tai;
}
bool tao(int x)
{
if(p[x].xue_liang<4)
{
// cout<<x<<"吃了一颗桃,血量"<<p[x].xue_liang<<"-->"<<p[x].xue_liang+1<<"\n";
return ++p[x].xue_liang,1;
}
else return 0;
}
bool chu_shan(int x)
{
rek(i,0,p[x].shou_pai.size())
{
int pai=p[x].shou_pai[i];
if(pai=='D')
{
// cout<<x<<"出了一张闪\n";
return p[x].shou_pai.erase(p[x].shou_pai.begin()+i),1;
}
}
return 0;
}
bool chu_sha(int x)
{
rek(i,0,p[x].shou_pai.size())
{
int pai=p[x].shou_pai[i];
if(pai=='K')
{
// cout<<x<<"出了一张杀\n";
return p[x].shou_pai.erase(p[x].shou_pai.begin()+i),1;
}
}
return 0;
}
bool sha(int x,int ii)
{
int k=p[x].right;
if(!(p[k].tiao_fan&&(p[x].shen_fen=="ZP"||p[x].shen_fen=="MP")||p[k].tiao_zhong&&p[x].shen_fen=="FP"||p[k].lei_fan_zhu&&p[x].shen_fen=="MP")) return 0;
// cout<<x<<"杀-->"<<k<<endl;
p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
if(p[k].tiao_fan)
{
p[x].tiao_zhong=1,p[x].tiao_fan=p[x].lei_fan_zhu=0;
// cout<<x<<"跳忠\n";
}
if(p[k].tiao_zhong)
{
p[x].tiao_fan=1;
// cout<<x<<"跳反\n";
}
if(!chu_shan(k)) shou_shang(k,x),shang_shai=1;
return 1;
}
bool jue_dou(int x,int ii)
{
int k=p[x].right;
while(k!=x)
{
if(p[k].si_wang_pan_duan)
{
k=p[k].right;
continue;
}
if(p[k].tiao_fan&&(p[x].shen_fen=="ZP"||p[x].shen_fen=="MP")||p[k].tiao_zhong&&p[x].shen_fen=="FP"||p[x].shen_fen=="MP"&&p[k].lei_fan_zhu) break;
k=p[k].right;
}
if(k==x) return 0;
if(p[x].shen_fen=="FP") k=1;
p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
// cout<<x<<"决斗-->"<<k<<endl;
if(p[k].tiao_fan)
{
p[x].tiao_zhong=1,p[x].tiao_fan=p[x].lei_fan_zhu=0;
// cout<<x<<"跳忠\n";
}
if(p[k].tiao_zhong)
{
p[x].tiao_fan=1;
// cout<<x<<"跳反\n";
}
if(!wu_xie_ke_ji(k,1,x)) return 1;
int id=k;
if(p[x].shen_fen=="MP"&&p[k].shen_fen=="ZP") return shou_shang(k,x),1;
while(chu_sha(id)) id=id==k?x:k;
return shou_shang(id,id==k?x:k),shang_shai=1;
}
bool nan_zhu_ru_qin(int x,int ii)
{
// cout<<x<<"使用南蛮入侵\n";
p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
rep(i,x+1,n)
{
if(p[i].si_wang_pan_duan) continue;
if(!wu_xie_ke_ji(i,1,x)) continue;
if(chu_sha(i)) continue;
else
{
shou_shang(i,x),shang_shai=1;
if(i==1&&p[x].tiao_zhong==0)
{
p[x].lei_fan_zhu=1;
// cout<<x<<"跳类反\n";
}
}
}
rep(i,1,x-1)
{
if(p[i].si_wang_pan_duan) continue;
if(!wu_xie_ke_ji(i,1,x)) continue;
if(chu_sha(i)) continue;
else
{
shou_shang(i,x),shang_shai=1;
if(i==1&&p[x].tiao_zhong==0)
{
p[x].lei_fan_zhu=1;
// cout<<x<<"跳类反\n";
}
}
}
}
bool wan_jian_qi_fa(int x,int ii)
{
// cout<<x<<"使用万箭齐发\n";
p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+ii);
rep(i,x+1,n)
{
if(p[i].si_wang_pan_duan) continue;
if(!wu_xie_ke_ji(i,1,x)) continue;
if(chu_shan(i)) continue;
else
{
shou_shang(i,x),shang_shai=1;
if(i==1&&p[x].tiao_zhong==0)
{
p[x].tiao_fan=1;
// cout<<x<<"跳反\n";
}
}
}
rep(i,1,x-1)
{
if(p[i].si_wang_pan_duan) continue;
if(!wu_xie_ke_ji(i,1,x)) continue;
if(chu_shan(i)) continue;
else
{
shou_shang(i,x),shang_shai=1;
if(i==1&&p[x].tiao_zhong==0)
{
p[x].tiao_fan=1;
// cout<<x<<"跳反\n";
}
}
}
}
signed main()
{
cin>>n>>m,ren_shu=n,p[1].left=n,p[1].right=2,p[n].left=n-1,p[n].right=1,p[1].tiao_zhong=1;
rep(i,1,n+1)
{
string jue_se;
getline(cin,jue_se);
if(!(i-1)) continue;
if(jue_se[0]=='M') p[i-1].shen_fen="MP";
if(jue_se[0]=='Z') p[i-1].shen_fen="ZP";
if(jue_se[0]=='F') p[i-1].shen_fen="FP";
fan_zhu_shu_liang+=(p[i-1].shen_fen=="FP"),p[i-1].shou_pai.push_back(jue_se[3]),p[i-1].shou_pai.push_back(jue_se[5]),p[i-1].shou_pai.push_back(jue_se[7]),p[i-1].shou_pai.push_back(jue_se[9]);
}
rek(i,2,n) p[i].left=i-1,p[i].right=i+1;
string s;
getline(cin,s);
rek(i,0,s.size()) if(s[i]!=' ') pai_dui[++cnt]=s[i];
cnt=0,lun_dao=1;
while(!p[1].si_wang_pan_duan&&fan_zhu_shu_liang>0)
{
if(p[lun_dao].si_wang_pan_duan)
{
lun_dao=lun_dao%n+1;
continue;
}
// cout<<lun_dao<<"摸到"<<pai_dui[cnt+1]<<'\n';
p[lun_dao].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
// cout<<lun_dao<<"摸到"<<pai_dui[cnt+1]<<'\n';
p[lun_dao].shou_pai.push_back(pai_dui[++cnt]),cnt-=(cnt==m);
int chu_sha_ci_shu=0;
if(p[lun_dao].shou_pai.size()==0)
{
lun_dao=p[lun_dao].right;
continue;
}
rek(i,0,p[lun_dao].shou_pai.size())
{
if(p[lun_dao].shou_pai.empty()||p[lun_dao].si_wang_pan_duan) break;
char pai=p[lun_dao].shou_pai[i];
if(pai=='P') if(tao(lun_dao)) p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+i),i=-1;
if(pai=='K') if((chu_sha_ci_shu<1||p[lun_dao].zhu_ge_lian_nu==1)&&sha(lun_dao,i)) ++chu_sha_ci_shu,i=-1;
if(pai=='F') if(jue_dou(lun_dao,i)) i=-1;
if(pai=='N') if(nan_zhu_ru_qin(lun_dao,i)) i=-1;
if(pai=='W') if(wan_jian_qi_fa(lun_dao,i)) i=-1;
if(pai=='Z') zhu_ge_lian_nu(lun_dao),p[lun_dao].shou_pai.erase(p[lun_dao].shou_pai.begin()+i),i=-1;
}
lun_dao=p[lun_dao].right;
}
game_over();
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...