#include<iostream> using namespace std; //存储每次递归后对应的排列情况 int a[12]; //标记数组 vis[12]; //存储围观党的判断信息 int side[12][12],flag[12]; //存储符合围观党判断信息的排列 int result[1000010][10]; int n,m,ans; //用模拟来判断对应每种排列是否符合所对应的信息 bool check(int b[]){ int i,j,k; for(i=0;i<m;i++) { int num=side[i][0]; for(j=1,k=0;j<=num&&k<n;k++) { if(side[i][j]==b[k]) { j++; } } if(j>num&&!flag[i]) return false; if(k>=n&&j<=num&&flag[i]) return false; } return true; } //列举所有的排列情况,对每一种情况进行检查 void dfs(int step){ if(step==n){ //如果符合情况,则ans++,并且将对应的情况存储到result数组中 if(check(a)){ for(int i=0;i<n;i++){ result[ans][i]=a[i]; } ans++; } return ; } for(int i=0;i<n;i++){ if(!vis[i]){ a[step]=i; vis[i]=1; dfs(step+1); vis[i]=0; } } } int main(){ //输入数据 cin>>n>>m; for(int i=0;i<m;i++){ cin>>side[i][0]; for(int j=1;j<=side[i][0];j++){ cin>>side[i][j]; } cin>>flag[i]; } //处理问题 dfs(0); //输出数据 cout<<ans<<endl; for(int i=0;i<ans;i++){ for(int j=0;j<n;j++){ cout<<result[i][j]<<" "; } cout<<endl; } return 0; }
0.0分
1 人评分