对于上面下面两个数字一旦确定,他们的解就确定了。所以可以4*4枚举头两个数字的所有可能,定下第二个数字,后面的数字就能一个个定下来。如果有一种能满足题意的结果就输出
#include<bits/stdc++.h> using namespace std; typedef pair<int,int> P; int a[100010]; int b[100010]; vector<int> vec; int main() { int n; scanf("%d",&n); for(int i=1;i<=n-1;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n-1;i++) { scanf("%d",&b[i]); } for(int i=1;i<=n-1;i++) { if(a[i]==2&&b[i]==1||a[i]<b[i]) { printf("NO "); return 0; } } for(int i=0;i<=3;i++) { for(int j=0;j<=3;j++) { if((i|j)==a[1]&&(i&j)==b[1]) { vec.clear(); vec.push_back(i); vec.push_back(j); int k=2; for(;k<=n-1;k++) { int last=*(vec.end()-1); bool flag=false; for(int index=0;index<=3;index++) { if( (index|last)==a[k]&&(index&last)==b[k] ) vec.push_back(index),flag=true;;//index是确定的,暴力是为了求值 } if(!flag) break; } if(k==n) { printf("YES "); for(int l=0;l<vec.size();l++) printf("%d ",vec[l]); printf(" "); return 0; } } } } }