要想这样打印二维数组?用递归?还是用什么方法?
写一个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 编辑 ]