一个算法设计问题

47522341 2006-06-15 07:33:19
问一个c语言算法问题:
问题描述是这样的:
有一个n×m的数组,以A[n][m]表示,现在在A数组的每一行里面依次取出一个元素,组成一个包含n个元素的新的一维数组,这样总共应该有(m的n次方)个这样的一维数组,请问在c语言里面设计一个什么样算法能实现把所有的一维数组打印输出?

ps:使用者可以自定义数组A的维数n、m;设计的算法不考虑算法的效率(当然效率更高更好),只要能实现就行。

举个例子:
A[n][m]=
[1 2 3
1 2 3
1 2 3
1 2 3]
那么算法结果就是输出81(3的4次方)个一维数组:
1 1 1 1
1 1 1 2
1 1 1 3
1 1 2 1
1 1 2 2
1 1 2 3
1 1 3 1
1 1 3 2
1 1 3 3
1 2 1 1
1 2 1 2
1 2 1 3
.......
.......
.......
3 3 3 3

由于对数据结构各种算法不熟悉,我想了两天,一直都没想出来,欢迎各位大侠热烈讨论。
...全文
292 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
crazy_lazy_pig 2006-06-16
  • 打赏
  • 举报
回复
tailzhou(尾巴)算法真妙, 记下来好好研究研究.
不过要计算m的n次方, 开销太大, 我给来个双层循环的:

void showshuzu(int **a,int m, int n){
int i,j;
int *k,kk;
k=calloc(m,sizeof(int));/*记录当前各行选取元素的列指标*/
for(i=0;i<m;i++)
k[i]=0; /*对列指标付初值*/
while(k[m-1]<n){
for(i=0;i<m;i++)
printf("%d ",*(a+i*n+k[i]));/*输出选择的结果, 不知为什么, 我用a[i][k[i]]运行时总出错, 所以只能出此下策.*/
printf("\n");

for(j=0;j<m;j++){/*调整k的值以进行下一次选择*/
if(++k[j]<n||j==m-1)/*这里模拟n进制数的数数过程*/
break; /*即每次都给最低位加一, 若达到n则向高一位进一*/
else /*当高一位达到n时则向更高位进一, 依此类推*/
k[j]=0; /*进过位的位要清零*/
}
}

free(k);
}
yzhg_cgl 2006-06-15
  • 打赏
  • 举报
回复
递归是一定可以实现的.
tailzhou 2006-06-15
  • 打赏
  • 举报
回复
写段伪码:
#define n=10;
#define m=10;

int a[n][m];
int i,j,k,a;
for(i=0;i<m**n,++i)
{
k=i;
for (j=0;j<m;++j)
{
printf("%d ",a[j][k%n]
k/=n;
}
printf("\n");
}
happytang 2006-06-15
  • 打赏
  • 举报
回复
递归
或者N层循环,逐个遍历
效率都不高
fflush 2006-06-15
  • 打赏
  • 举报
回复
这个从逻辑上来讲很简单,也就是说从每一行取出来一个元素,穷举所有可能的取法,实现起来也比较直观,所以我实现了一个供参考的版本
#define N 4
#define M 3

#include <stdio.h>
#include <conio.h>

int A[N][M] =
{
1, 2, 3,
1, 2, 3,
1, 2, 3,
1, 2, 3,
};

//Elements selected from each row
int Work[N];

void perm (int row)
{
for (int i = 0; i < M; i++)
{
//select the ith element in row
Work[row] = A[row][i];

if (row == N - 1)
{
//if last row, print result
for (int j = 0; j < N; j++)
printf ("%d ", Work[j]);
printf ("\n");
}
else
//do with next row
perm (row + 1);
}
}

int main ()
{
perm (0);

_getch ();
}
minioreo 2006-06-15
  • 打赏
  • 举报
回复
建议你看下谭浩强的那本经典的《c程序设计》
里面讲枚举类型的时候 讲到了类似的穷举算法 是用循环嵌套解决从一堆球里拿出3个不同颜色的球的取法
你可以参照一下 也许能有用
  在有关算法的书中,有一些叙述非常严谨,但不够全面;另一些涉及了大量的题材,但又缺乏严谨性。本书将严谨性和全面性融为一体,深入讨论各类算法,并着力使这些算法的设计和分析能为各个层次的读者接受。全书各章自成体系,可以作为独立的学习单元;算法以英语和伪代码的形式描述,具备初步程序设计经验的人就能看懂;说明和解释力求浅显易懂,不失深度和数学严谨性。 《算法导论(原书第3版)》选材经典、内容丰富、结构合理、逻辑清晰,对本科生的数据结构课程和研究生的算法课程都是非常实用的教材,在it专业人员的职业生涯中,本书也是一本案头必备的参考书或工程实践手册。    第3版的主要变化:    新增了van emde boas树和多线程算法,并且将矩阵基础移至附录。    修订了递归式(现在称为“分治策略”)那一章的内容,更广泛地覆盖分治法。    移除两章很少讲授的内容:二项堆和排序网络。    修订了动态规划和贪心算法相关内容。    流网络相关材料现在基于边上的全部流。    由于关于矩阵基础和strassen算法的材料移到了其他章,矩阵运算这一章的内容所占篇幅更小。    修改了对knuth-morris-pratt字符串匹配算法的讨论。    新增100道练习和28道思考题,还更新并补充了参考文献。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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