关注
再贴一种方法哈,昨天吃饭时候跟朋友讨论,换了一种思路,昨天晚上做了一下。
#include <iostream>
#include <vector>
#include <string>
#include <queue>
#include <unordered_map>
#include <map>
#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;
}
}
//第一步,选出用于全排列的数
void chooseperm(vector<int> &permuse)
{
vector<int> permtemp;
int permnum=0;//需要全排列的数的个数
int temp=0;
for(int i=1;i<=n;i++)//初始化为1~n
permtemp.push_back(i);
for(int i=0;i<a.size();i++)//移除输入中已有的数
{
if(a[i])
{
remove(permtemp.begin(),permtemp.end(),a[i]);
temp++;
}
}
permnum=n-temp;//n-移除的数,即需要全排列的数的个数
for(int i=0;i<permnum;i++)//得到用于全排列的vector
permuse.push_back(permtemp[i]);
}
//第二步,对第一步选出的数全排列
void creatperm(vector<vector<int> > &perm,vector<int> &permuse)
{
do{
perm.push_back(permuse);
}while(next_permutation(permuse.begin(), permuse.end()));
}
//第三步,拼接第二步得到的全排列的二维vector和已有的输入
void insertperm(vector<vector<int> > &perminsert,const vector<vector<int> > &perm)
{
for(int i=0;i<perm.size();i++)
{
vector<int> tempinsert;
int q=0;
for(int p=0;p<n;p++)
{
if(a[p])
tempinsert.push_back(a[p]);
else
tempinsert.push_back(perm[i][q++]);
}
perminsert.push_back(tempinsert);
}
}
//第四步,逐行验证其有序对是否为k,统计符合的个数
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);
}
//第一步,选出用于全排列的数
vector<int> permuse;//用于全排列的数
chooseperm(permuse);
cout<<"用于全排列的数"<<endl;
for(int i=0;i<permuse.size();i++)
cout<<permuse[i]<<" ";
cout<<endl;
//第二步,对第一步选出的数全排列
vector<vector<int> > perm;//得到全排列的二维vector
creatperm(perm,permuse);
cout<<"全排列"<<endl;
printperm(perm);
//第三步,拼接第二步得到的全排列的二维vector和已有的输入
vector<vector<int> > perminsert;
insertperm(perminsert,perm);
cout<<"符合模板的排列"<<endl;
printperm(perminsert);
//第四步,逐行验证其有序对是否为k,统计符合的个数
count(perminsert);
cout<<"符合的排列个数"<<endl;
cout<<cnt<<endl;
}
查看原帖
点赞 3
相关推荐
牛客热帖
正在热议
# 25届秋招总结 #
331699次浏览 3135人参与
# 上班苦还是上学苦呢? #
73590次浏览 656人参与
# 阿里云管培生offer #
37338次浏览 424人参与
# 地方国企笔面经互助 #
4575次浏览 12人参与
# 如果有时光机,你最想去到哪个年纪? #
22065次浏览 415人参与
# 选完offer后,你后悔学本专业吗 #
22074次浏览 159人参与
# 百度开奖 #
186002次浏览 1166人参与
# 我的实习求职记录 #
6072926次浏览 83555人参与
# 如何一边实习一边秋招 #
997314次浏览 12669人参与
# 找工作时遇到的神仙HR #
553795次浏览 3803人参与
# 入职第一天,你准备什么时候下班 #
21680次浏览 144人参与
# 招聘要求与实际实习内容不符怎么办 #
10829次浏览 277人参与
# bilibili求职进展汇总 #
33357次浏览 357人参与
# 许愿池 #
214947次浏览 2535人参与
# 学历or实习经历,哪个更重要 #
54124次浏览 424人参与
# 你今年的平均薪资是多少? #
71099次浏览 345人参与
# 实习工作,你找得还顺利吗? #
248056次浏览 2913人参与
# 通信硬件薪资爆料 #
609787次浏览 5198人参与
# 海康威视求职进展汇总 #
400970次浏览 3408人参与
# 携程求职进展汇总 #
135945次浏览 932人参与
# 正在实习的你,几点下班 #
53457次浏览 396人参与
# 工作两年想退休了 #
53155次浏览 673人参与