| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2172 人关注过本帖, 1 人收藏
标题:要想这样打印二维数组?用递归?还是用什么方法?
只看楼主 加入收藏
messifans
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-8-13
结帖率:0
收藏(1)
已结贴  问题点数:20 回复次数:11 
要想这样打印二维数组?用递归?还是用什么方法?
写一个C程序,类似如下 已知一个二维数组
1 2 0 0
3 5 0 0
4 6 0 0
打印出结果:
134 136 154 156
234 236 254 256
这只是一个例子用来说明问题,实际上是针对一个m行n列的结果。
另外也希望考虑如下情况:
1 2 0 0
0 0 0 0
4 6 0 0
即中间某一行全为0;我们希望结果是104 106 204 206;
当然不用考虑这样的情况,即
0 1 2 0
3 5 0 0
4 6 0 0
即0肯定是不会出现在每一行开始处的,0肯定都集中在右侧。
其实这个二维数组是这样产生的:
我们初始化了一个二维数组,全为0;
在每一行保存了一个问题的结果,所以只会 1 2 0 0,这样  不会0 1 2 0 ,当然会有0 0 0  0全为0 的情况。。。
不知道我说清楚了没???。。。哎我,谢谢大家
有大神没?整一个啊。。。

同志们能具体点不???
第一感觉都挺简单,三个for循环,具体实现由很多问题啊。。。亲。。。

非常感谢大家的帮助,以下是我觉得比较好的解决方法,另外8楼朋友虽然不完全满足要求,但这想法可以值得借鉴。个人觉着for循环在这里会相当麻烦,不可取。。。
---------------------------------------------------------------------------------------------------------------------------------------------------
程序代码:
#include<stdio.h>
#include <stdlib.h>
#define M 3
#define N 4

void main()
{
        
        int arr[M][N] = {{1,2,0,0},{0,0,0,0},{4,6,0,0}};
        int i[N] = {0}; // 控制每行的位置
        int end[M] = {0}; // 每行的有效位数
        int index = 0;
        int l;
        int r[M] = {0};
        int k,j;
        /*
        ** 预处理,找到每行的有效位数
        */
        for (k = 0; k<M; k++)
        {
                end[k] = 1;//每行有效位默认为1
                for (j = 0; j<N; j++)
                {
                        if (0 != arr[k][j]) // 找到最后一个不为0的数,设置该行的有效位数
                                end[k] = j + 1;
                }
        }

        /*
        ** 开始循环,index指示当前行,i[index]指示当前行的当前列
        */
        while(index < M && index >=0)
        {
                if( i[index] < end[index] ) // 如果当前行的当前列小于当前行的有效位数,则存入r[]中
                {
                        r[index] = arr[index][i[index]];
                        i[index]++;                                // 当前行的列数+1
                        index++;                                // 行数+1,即到下一行
                }
                
                if (M == index)             // 如果当前行数为M,则r[]存满了,打印输出,同时回到上一行
                {
                        for (l = 0; l<M; l++)
                        {
                                printf("%d", r[l]);
                        }
                        printf("\n");
                        index --;
                }
                if (i[index] == end[index]) // 如果当前行的列数已经到了有效位数,则当前行的列数回到0处,同时回到上一行
                {
                        
                        i[index] = 0;
                        index --;
                        
                }
        }


        

}



[ 本帖最后由 messifans 于 2013-8-14 10:03 编辑 ]
2013-08-13 20:24
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:3 
用for循环嵌套输出即可

思考赐予新生,时间在于定义
2013-08-13 20:55
veketdelphi
Rank: 5Rank: 5
等 级:职业侠客
帖 子:67
专家分:374
注 册:2013-4-8
收藏
得分:3 
楼上正解
程序代码:
//-----------------------------------------------
//---------- C++ Builder 6.0 --------------------
//------------ veket的小号 ----------------------
//-----------------------------------------------
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a[3][4] = {{1, 2}, {3, 5}, {4, 6}};
    int i;
    int j;
    int k;
    for(i=0;a[0][i]!=0;i++)
    {
        for(j=0;a[1][j]!=0;j++)
        {
            for(k=0;a[2][k]!=0;k++)
            {
                printf("%d%d%d\n", a[0][i], a[1][j], a[2][k]);
            }
        }
    }
    system("pause");
    return 0;
}

2013-08-13 21:31
love云彩
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:青藏高原
等 级:贵宾
威 望:53
帖 子:3663
专家分:11416
注 册:2012-11-17
收藏
得分:0 
跟楼上的差不多,楼上只是将if条件判断简略到for语句的判断条件里面去了
程序代码:
#include<cstdio>
void main()
{
    int i,j,z;
    int a[][4]={{1,2,0,0},{3,4,0,0},{5,6,0,0}};
    for(i=0;i<4;i++)
    {
        if(a[0][i]!=0){//if语句用来判断数组元素是否为0
            for(j=0;j<4;j++)
                if(a[1][j]!=0){
                    for(z=0;z<4;z++)
                        if(a[2][z]!=0){
                            printf("%3d%d%d",a[0][i],a[1][j],a[2][z]);
                        }
                }
        }
        printf("\n");//每次循环完之后就换行一次,即可原样输出楼主想要的模式
    }
}


思考赐予新生,时间在于定义
2013-08-13 21:41
messifans
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-8-13
收藏
得分:0 
回复 4楼 love云彩
非常感谢,这的确解决了我说的那个例子,不过实际上我这个矩阵是m行n列的,不是确定的,
这样for循环是不是有点问题?如果我是10行4列的结果呢?这样我感觉还是有点问题,你觉着呢?
2013-08-13 21:56
messifans
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-8-13
收藏
得分:0 
回复 3楼 veketdelphi
非常感谢,这的确解决了我说的那个例子,不过实际上我这个矩阵是m行n列的,不是确定的,
这样for循环是不是有点问题?如果我是10行4列的结果呢?这样我感觉还是有点问题,你觉着呢?
另外针对类似这样的数组int arr[3][4] = {{1,2,0,0},{0,0,0,0},{4,6,0,0}};就是某一行结果全为0的,可能也有问题。
我们希望结果是104 106 204 206
2013-08-13 21:57
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:3 
直接递归啊
2013-08-13 22:12
czz5242199
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:660
专家分:2400
注 册:2011-10-26
收藏
得分:0 
程序代码:
#include <stdio.h>

int a[3][2]={1,2,3,5,4,6};
int n=2,m=3;

void print(int h,int g)
{
     if (h==m)
     {
              printf("%d\n",g);
              return;
     }
     int i;
     for (i=0; i<n; i++)
         print(h+1,g*10+a[h][i]);
}

int main()
{
    print(0,0);
    
    system("pause");
}

如果数字很大,就用数组代替变量g
2013-08-13 22:17
小小程序猿
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:1
帖 子:755
专家分:2785
注 册:2013-7-18
收藏
得分:3 
你可以利用for循环嵌套,里面加上判断语句if。
至于你说的m行n列的问题,你可以要求输入变量mn,for结束的判断也加入mn
至于怎么用if语句实习你说的功能,楼主最好还是自己多想想

孤独与寂寞是催化一个人迅速成长的良药,没有之一
2013-08-14 06:32
月祭樱冢
Rank: 2
等 级:论坛游民
帖 子:83
专家分:97
注 册:2013-7-15
收藏
得分:3 
如果要推广的m*n的数组  就要用动态内存分配

算法是程序的灵魂
2013-08-14 08:36
快速回复:要想这样打印二维数组?用递归?还是用什么方法?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.039772 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved