求个算法,该如何处理

求个算法有一个可变二维数组 a[m][n]例如:a[0]{1,2,3,4,5,6}a[1]{1,2,3,4,5}a[2]{1,2,3,4}a[3]{1,

求个算法
有一个可变二维数组 a[m][n];

例如:
a[0]={1,2,3,4,5,6};
a[1]={1,2,3,4,5};
a[2]={1,2,3,4};
a[3]={1,2,3,4,5,6,7};
a[i]={x,y,z};

我需要遍历这个数组,并且规则如下:
a[0][0],a[1][0],a[2][0],a[3][0],a[i][0]
a[0][1],a[1][0],a[2][0],a[3][0],a[i][0]
a[0][2],a[1][0],a[2][0],a[3][0],a[i][0]
a[0][n-1],a[1][0],a[2][0],a[3][0],a[i][0]
a[0][0],a[1][1],a[2][0],a[3][0],a[i][0]
a[0][0],a[1][n-1],a[2][0],a[3][0],a[i][0]

即 每次从每个数组中选一个值出来与其他数组的值做匹配成一组数据。

突然脑子就短路了,没想出这个循环要怎么写。

[解决办法]
能把那个遍历规则用文字描述一下么?
[解决办法]
//下面主要是用了递归,一旦满足条件,使前一位增1
#include <vector>
#include <iostream>
using namespace std;

int check(int curpos, vector<int> &pos, vector<vector<int> > a);

int main()
{
vector<vector<int> > a;
vector<int> suba;
suba.push_back(1);
suba.push_back(2);
a.push_back(suba);

vector<int> subb;
subb.push_back(11);
subb.push_back(12);
subb.push_back(13);
a.push_back(subb);

vector<int> subc;
subc.push_back(21);
subc.push_back(22);
subc.push_back(23);
subc.push_back(24);
a.push_back(subc);

vector<int> pos;
pos.resize(a.size());
for(int i=0; i<(int)pos.size(); i++)
{
pos[i]=0;
}

for(int i=0; i<(int)a.size();)
{
cout<<a[i][pos[i]]<<",";
i++;
if(i==a.size())
{
cout<<endl;
int ret = check(i-1,pos, a);
if(ret == 0)
break;

i=0;
}
}
}



int check(int curpos, vector<int> &pos, vector<vector<int> > a)
{
pos[curpos]++;

if(curpos==0)
{
if(pos[0]>=a[0].size())
{return 0;}
}

if(pos[curpos]>=a[curpos].size())
{
pos[curpos] = 0;
int ret = check(curpos-1,pos, a);
if(ret==0)
return 0;
}

return 1;
}

[解决办法]

探讨

引用:

能把那个遍历规则用文字描述一下么?


不好意思,可能没表达清楚。

遍历规则就是 每次从二维数组中的第二维中的每个数组中依次取一个值,组成一组数据,这组数据将做为其他函数的输入值,这里可以不关心,但是要保证所有的组合。

[解决办法]
就是一个求排列组合的问题
[解决办法]
用一个 数组,len[m]记录a[m]的每一个维度的长度.
一个数组保存参数 arg[m];
然后假设你那个其他函数是 f(arg[],m)这样调用
//m是维数,n表示已经构造了n个数据.开始是 1;
void fun(int **arr,int *len,int* arg,int m,int n=1)
{
if(n==m)
{
f(arg,m);
return ;
}
for(int i=0;i<len[n];i++)
{
int temp=arr[n];
arg[n]=arr[n][i];
fun(arr,len,arg,m,n+1);
arr[n]=temp;//恢复.
}
}
[解决办法]
这样的问题用递归很容易解决:
C/C++ code
#include<iostream>#include<vector>#include<stack>using namespace std;void setVector(vector<vector<int> > &a){                        //    这个只是用来构建测试数据的,别当真了。    vector<int> a1;    int an[]={6,5,4,7,3};    for (int i=0;i<5;++i)    {        a.push_back(a1);        for (int j=0;j<an[i];++j)            a[i].push_back(j+1);    }}void output(vector<vector<int> > &a,int c){    static int ai[100];    if (c<0)    {        for (int i=0;i<a.size();++i)            cout<<ai[i]<<" ";        cout<<endl;    }    else    {        for (int i=0;i<a[c].size();++i)        {            ai[c]=a[c][i];            output(a,c-1);        }    }}int main(){    vector<vector<int> > a;    setVector(a);        //    构建数组,这个部分我就偷懒了哈    output(a,a.size()-1);            //  递归输出    return 0;} 


[解决办法]
再发一遍:

C/C++ code
arr二维数组。 len 各维度长度。 arg 生成的参数 m,总维度数目。 k,构造arg[k].void fun(int **arr,int *len,int *arg,int m,int k=0){if(k+1==m){for(int i=0;i<m;i++)   printf("%d ",arg[i]);puts("");}for(int j=0;j<len[k];j++){int t=arg[k];arg[k]=arr[k][i];fun(arr,len,arg,m,k+1);arg[k]=t;}}
[解决办法]
探讨
有一个可变二维数组 a[m][n];

例如:
a[0]={1,2,3,4,5,6};
a[1]={1,2,3,4,5};
a[2]={1,2,3,4};
a[3]={1,2,3,4,5,6,7};
a[i]={x,y,z};

我需要遍历这个数组,并且规则如下:
a[0][0],a[1][0],a[2][0],a[3][0],a[i][0]
a[0][1],a[1][0],……