Chinaunix
标题:
请教个排列算法
[打印本页]
作者:
c/unix
时间:
2014-03-17 08:59
提示:
作者被禁止或删除 内容自动屏蔽
作者:
bruceteen
时间:
2014-03-17 11:09
假设有 n 行,各行分别有 a1、a2、a3 …… an 个数据
for( 整型 i=0; i!=a1*a2*a3……*an; ++i )
{
第一行取第 i / (a2*a3……*an) 个数据
第二行取第 i % (a2*a3……*an)/(a3……*an) 个数据
……
}
这样比较简单,但如果 a1*a2*a3……*an 太大的话,没有这样的内置整型能容纳下
另一种,就是自己做个栈
{第一行当前索引,第一行最大索引}
{第二行当前索引,第二行最大索引}
……
作者:
selfrun
时间:
2014-03-17 11:20
1、用递归
2、模拟递归,作个长度等于行数的整数数组,每个数组元素是对应行的循环计数。
作者:
selfrun
时间:
2014-03-17 11:20
1、用递归
2、模拟递归,作个长度等于行数的整数数组,每个数组元素是对应行的循环计数。
作者:
bruceteen
时间:
2014-03-17 12:07
吃饭回来,瞎写的,给你参考一下
#include <iostream>
#include <vector>
using namespace std;
int main()
{
// 输入
vector< vector<int> > buf;
{
vector<int> tmp;
tmp.push_back( 1 );
tmp.push_back( 2 );
buf.push_back( tmp );
tmp.clear();
tmp.push_back( 44 );
tmp.push_back( 55 );
tmp.push_back( 66 );
buf.push_back( tmp );
tmp.clear();
tmp.push_back( 88 );
tmp.push_back( 99 );
buf.push_back( tmp );
}
// 输出
if( !buf.empty() )
{
vector<size_t> pro( buf.size(), 0 );
for( ; pro.front() != buf.front().size(); )
{
for( size_t i=0; i!=pro.size(); ++i )
cout << buf[i][pro[i]] << ' ';
cout << '\n';
// next
for( size_t i=pro.size(); i!=0; --i )
{
if( pro[i-1]+1!=buf[i-1].size() || i-1==0 )
{
++pro[i-1];
break;
}
else if( i-1 != 0 )
{
pro[i-1] = 0;
}
}
}
}
return 0;
}
复制代码
作者:
c/unix
时间:
2014-03-17 12:27
提示:
作者被禁止或删除 内容自动屏蔽
作者:
folklore
时间:
2014-03-17 14:29
这个好办, 两个Loop就好了
原始数据:
1 2
44 555 66
88 9
有三行数据,设一个长度为两3的数组:
一个表示长度: 2 3 2
一个表示当前计数
0 0 0
当前计数加1,直到 121为止~
算法如下:
#include <vector>
#include <stdio.h>
void permulation_next(const std::vector<std::vector<int>>& meta, std::vector<int>& ic){
// +1
int icarry =1;
for(size_t irow =0; irow <meta.size(); irow++){
int iv =icarry +ic[irow];
ic[irow] =iv;
if(iv ==(int)meta[irow].size()){
icarry =1;
ic[irow] =0;
}else{
icarry =0;
break;
}
}
}
int main(){
int params[][3]={
{1,2,},
{44, 555, 66,},
{88, 9,},
};
int nlen[] ={2,3,2};
std::vector<std::vector<int>> meta;
for(int irow =0; irow <_countof(params); irow ++){
std::vector<int> rows;
for(int iitem =0; iitem <nlen[irow]; iitem++){
rows.push_back(params[irow][iitem]);
}
meta.push_back(rows);
}
std::vector<int> ic;
int nloops =1;
for(int irow =0; irow <_countof(params); irow++){
ic.push_back(0);
nloops *=nlen[irow];
}
for(int iloop =0; iloop <nloops; iloop++){
for(size_t irs =0; irs <ic.size(); irs++){
printf("%d ",meta[irs][ic[irs]]);
}
puts(" --");
permulation_next(meta,ic);
}
return 0;
}
复制代码
作者:
folklore
时间:
2014-03-17 14:33
回复
5#
bruceteen
**nb,8741
作者:
BlueGuy_
时间:
2014-03-18 00:39
提示:
作者被禁止或删除 内容自动屏蔽
作者:
BlueGuy_
时间:
2014-03-18 00:45
提示:
作者被禁止或删除 内容自动屏蔽
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2