求个算法

gnimgnot 2012-04-22 07:14:25
有一个可变二维数组 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]

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

突然脑子就短路了,没想出这个循环要怎么写。
...全文
153 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
evencoming 2012-04-23
  • 打赏
  • 举报
回复
m同理
evencoming 2012-04-23
  • 打赏
  • 举报
回复
如果用嵌套的vector.那么 len[n]可以替换为 vector::size
evencoming 2012-04-23
  • 打赏
  • 举报
回复
用一个 数组,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;//恢复.
}
}
gnimgnot 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 5 楼 的回复:

引用 2 楼 的回复:

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


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

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

能不 能用数学语言描述?
现在越来越喜欢先定义,再描述问题的那种数学语言了..
[/Quote]

呃。再次不好意思

有一个可变二维数组 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],a[1],a[2],a[3]...a[i]中的一个值,注意:每次只取其中的一个值,这样一趟下来一共取i个值,然后组成我想要的数据传入其他函数。
我的要求是保证要覆盖所有的组合,
比如第一次取的1,1,1,1,x;
第二次取的2,1,1,1,x
第三次取的3,1,1,1,x
第四次取的4,1,1,1,x
第五次取的5,1,1,1,x
第六次取的6,1,1,1,x
第七次取的1,2,1,1,x
........
........
这样
fthislife 2012-04-23
  • 打赏
  • 举报
回复
就是一个求排列组合的问题
fthislife 2012-04-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
有一个可变二维数组 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],……
[/Quote]
用回朔方法做的
#include<stdio.h>
#include<string.h>
void main()
{
int n,a[50],b[10],k,i;
char c[10][50];
printf("input n:");
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
scanf("%s",c[i]);
getchar();
b[i]=strlen(c[i])-1;
}
k=0;
a[0]=0;
while(1)
{
if(k==(n-1))
{
for(i=0;i<n;i++)
printf("%c",c[i][a[i]]);
printf("\n");
}
if(k<n-1)
{
k++;
a[k]=0;
continue;
}
while(a[k]==b[k]&&k>0){k--;}
if(a[k]==b[k]&&k==0)
break;
else
a[k]++;
}
}
evencoming 2012-04-23
  • 打赏
  • 举报
回复
再发一遍:
[code=C/C++]
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;
}
}
[/CODE]
evencoming 2012-04-23
  • 打赏
  • 举报
回复
无语了。。
我10L的代码,11L的说明又没了???
最近我发帖经常消失。。

打几个字的消失也就得了。。那么一大段代码都没。。。我++
muyi66 2012-04-23
  • 打赏
  • 举报
回复
这样的问题用递归很容易解决:

#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;
}
evencoming 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

引用 2 楼 的回复:

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


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

遍历规则就是 每次从二维数组中的第二维中的每个数组中依次取一个值,组成一组数据,这组数据将做为其他函数的输入值,这里可以不关心,但是要保证所有的组合。
[/Quote]
能不 能用数学语言描述?
现在越来越喜欢先定义,再描述问题的那种数学语言了..
gnimgnot 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

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

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

遍历规则就是 每次从二维数组中的第二维中的每个数组中依次取一个值,组成一组数据,这组数据将做为其他函数的输入值,这里可以不关心,但是要保证所有的组合。
dragoo1 2012-04-22
  • 打赏
  • 举报
回复
//下面主要是用了递归,一旦满足条件,使前一位增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;
}
pathuang68 2012-04-22
  • 打赏
  • 举报
回复
能把那个遍历规则用文字描述一下么?

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧