这份代码认为猎人死后被女巫救活,再被杀死,然后再带走玩家的情况是不成立的,但能AC。
#include<bits/stdc++.h>
using namespace std;
int t,op,id1,id2,p;
int n,m,die_people;
struct node{
int c,k,g,b;
}a[25],b[25];
bool vis[25];
signed main(){
cin>>t>>n;
for(int i=1;i<=n;i++) cin>>a[i].c,a[i].k=1;
for(int i=1;i<=n;i++) if(a[i].c==4) a[i].g=1,a[i].b=1;
while(t--){
memset(vis,0,sizeof(vis));
die_people=0;p=0;
cin>>m;
for(int i=1;i<=n;i++) b[i]=a[i];
while(m--){
cin>>op>>id1>>id2;
if(p) continue;
if(id1>n||id2>n||id1<1||id2<1){
p=1;
continue;
}
if(vis[id1]){
p=1;
continue;
}
vis[id1]=1;
if(op==0){
if(id1==id2) p=1;
if(b[id1].k==0||b[id2].k==0) p=1;
if(b[id1].c!=1) p=1;
b[id2].k=0;
}else if(op==1){
if(id1==id2) p=1;
if(b[id1].k==0||b[id2].k==0) p=1;
if(b[id1].c!=4) p=1;
if(b[id1].b==0) p=1;
b[id2].k=0;
b[id1].b--;
}else if(op==2){
if(b[id1].k==0&&id1!=id2) p=1;
if(b[id2].k) p=1;
if(a[id2].k==0) p=1;
if(b[id1].c!=4) p=1;
if(b[id1].g==0) p=1;
b[id2].k=1;
b[id1].g--;
}else if(op==3){
if(id1==id2) p=1;
if(b[id1].k) p=1;
if(b[id2].k==0) p=1;
if(b[id1].c!=3) p=1;
b[id2].k=0;
}
//cout<<p<<'\n';
}
for(int i=1;i<=n;i++){
if(b[i].c==3&&b[i].k!=a[i].k&&!vis[i]) p=1;
}
if(p){
puts("Wrong");
continue;
}
for(int i=1;i<=n;i++){
if(a[i].k!=b[i].k) die_people++;
}
if(die_people==0){
puts("Safe");
}else{
cout<<die_people<<' ';
for(int i=1;i<=n;i++){
if(a[i].k!=b[i].k) cout<<i<<' ';
}
cout<<'\n';
}
for(int i=1;i<=n;i++) a[i]=b[i];
}
return 0;
}
。
Hack:
1 5
1 1 4 4 3
6
0 1 5
3 5 1
2 3 5
0 2 5
3 5 2
2 4 5
输出:
2 1 2