#include <iostream> #include <vector> #include <algorithm> using namespace std; //输入参数 int n;//输入n个数 int k;//有序对k对 vector<int> a;//输入序列a,包含1~n的n个数,有若干个数(不超过10个)是0 //输出参数 int cnt=0;//合法排列的数目 //输出perm数组,用于测试 void printperm(const vector<vector<int> > &perm) { for(int i=0;i<perm.size();i++) { for(int j=0;j<perm[0].size();j++) cout<<perm[i][j]<<" "; cout<<endl; } } //将1~n全排列,放入二维数组perm void creatperm(vector<vector<int> > &perm) { vector<int> temp;//1~n的临时vector for(int i=1;i<=n;i++) temp.push_back(i); do{ perm.push_back(temp); }while(next_permutation(temp.begin(), temp.end())); } //过滤,刷掉返回false,如果没有刷掉返回true bool chooseperm(const vector<int> &permtemp) { for(int i=0;i<n;i++) { if(a[i]) { if(a[i]!=permtemp[i]) return false; } } return true; } //计算cnt void count( const vector<vector<int> > &choose) { for(int i=0;i<choose.size();i++) { int ktemp=0; vector<int> temp=choose[i]; for(int j=0;j<temp.size();j++) { for(int jj=j+1;jj<temp.size();jj++) { if(temp[j]<temp[jj]) ktemp++; } } if(ktemp==k) cnt++; } } int main(){ //输入 cin>>n>>k; for(int i=0;i<n;i++) { int temp; cin>>temp; a.push_back(temp); } //第一步 //先将1~n全排列(permutation),生成一个二维数组备用(每一行代表一种排序方式); vector<vector<int> > perm;//用于存放全排列的二维vector creatperm(perm); cout<<"全排列:"<<endl; printperm(perm);//测试生成是否正确 //第二步 //过滤该二维数组,选取满足特定位置上为输入序列中非0数的序列,生成新的二维数组; vector<vector<int> > choose;//过滤之后的二维数组 for(int i=0;i<perm.size();i++) { if(chooseperm(perm[i])) choose.push_back(perm[i]); } cout<<"过滤后:"<<endl; printperm(choose);//测试生成是否正确 //第三步 //逐行验证其有序对是否为k,统计符合的个数; count(choose); cout<<"符合的排列个数"<<endl; cout<<cnt<<endl; }
点赞 1

相关推荐

已老实求offer😫:有点像徐坤(没有冒犯的意思哈)
点赞 评论 收藏
分享
10-24 11:10
山西大学 Java
若梦难了:哥们,面试挂是很正常的。我大中厂终面挂,加起来快10次了,继续努力吧。
点赞 评论 收藏
分享
牛客网
牛客企业服务