再贴一种方法哈,昨天吃饭时候跟朋友讨论,换了一种思路,昨天晚上做了一下。 #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

相关推荐

预计下个星期就能开奖吧,哪位老哥来给个准信
华孝子爱信等:对接人上周说的是这周
点赞 评论 收藏
分享
点赞 评论 收藏
分享
牛客网
牛客企业服务