吴纪枫


私信TA

用户名:Hary123

访问量:550

签 名:

等  级
排  名 3712
经  验 1857
参赛次数 0
文章发表 2
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

#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 人评分

  评论区

  • «
  • »