原题链接:蓝桥杯算法提高VIP-3000米排名预测
#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分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复