下午比赛第3题求调
  • 板块学术版
  • 楼主_th_tw_on_
  • 当前回复2
  • 已保存回复2
  • 发布时间2025/1/19 21:26
  • 上次更新2025/1/20 09:35:47
查看原帖
下午比赛第3题求调
987530
_th_tw_on_楼主2025/1/19 21:26

rt,悬1关,orz

题目

#include<bits/stdc++.h>
using namespace std;
const int N=25;
bool v;
int dy[N],jy[N],lr[N],lg[N],vdie[N];
int bdy[N],bjy[N],blr[N],blg[N],bvdie[N];
int t,n,a[N],m,op,id1,id2,jss[N],die[N],d,s;
bool cz(int js,int x,int y){
//	1狼 2民 3猎 4巫
	if(x<1||x>n||y<1||y>n)return 0;//编号不合法 
	if(vdie[x]<0||vdie[y]<0)return 0;//之前死的 
	if(js==0){//狼
		if(jss[x]!=1)return 0;//不是狼
		if(vdie[x]||vdie[y])return 0;//杀或被杀的已经死了
		if(lg[x])return 0;//用过技能了
		if(x==y)return 0;//杀自己
		lg[x]=1;//今天杀过了
		vdie[y]=1,d++;//杀了
		return 1;
	}else if(js==1){//巫毒(堵)
		if(jss[x]!=4)return 0;//不是巫
		if(vdie[x]||vdie[y])return 0;//杀或被杀的已经死了
		if(dy[x])return 0;//用过技能了
		if(x==y)return 0;//杀自己
		dy[x]=t+114;//毒药夜
		if(dy[x]==jy[x])return 0;//同一天用技能
		vdie[y]=1,d++;//杀了 
		return 1;
	}else if(js==2){//巫救
		if(jss[x]!=4)return 0;//不是巫
		if(vdie[x]||!vdie[y])return 0;//巫死了或救的是活的 
		if(jy[x])return 0;//用过技能了
		if(x==y&&vdie[x]!=1)return 0;//救自己且还活着
		jy[x]=t+114;//解药夜
		if(dy[x]==jy[x])return 0;//同一天用技能
		vdie[y]=0,d--;//救了
		return 1;
	}else if(js==3){//猎
		if(jss[x]!=3)return 0;//不是猎
		if(vdie[x]!=1)return 0;//未死
		if(lr[x])return 0;//用过技能了
		if(x==y)return 0;//杀自己
		lr[x]=1;//带走了
		vdie[y]=1,d++;
		return 1;
	}else{
		return 0;
	}
}
void bf(){
	for(int i=1;i<=n;i++){
		bdy[i]=dy[i],bjy[i]=jy[i];
		blr[i]=lr[i],blg[i]=lg[i],bvdie[i]=vdie[i];
	}
}
void hy(){
	for(int i=1;i<=n;i++){
		dy[i]=bdy[i],jy[i]=bjy[i];
		lr[i]=blr[i],lg[i]=blg[i],vdie[i]=bvdie[i];
	}
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>t>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i],jss[i]=a[i];
	}
	while(t--){
		cin>>m;
		d=s=0,v=1;
		memset(lg,0,sizeof(lg));//狼技能重置 
		while(m--){
			cin>>op>>id1>>id2,v&=cz(op,id1,id2);
		}
		if(!v){
			cout<<"Wrong\n";
		}else{
			bool f=0;
			for(int i=1;i<=n;i++){
				if(vdie[i]==1&&a[i]==3&&!lr[i]){ 
					f=1,cout<<"Wrong\n",hy();break;
				}
			}
			if(f)continue;
			if(!d){cout<<"Safe\n";bf();continue;}
			cout<<d;
			for(int i=1;i<=n;i++){
				if(vdie[i]==1)cout<<" "<<i,vdie[i]=-1;
			}
			bf();cout<<"\n";
		}
	}
	return 0;
}
2025/1/19 21:26
加载中...