如何编写程序在二维数组中按垂直模式填充连续数字(跳过0)
二维数组垂直模式替换1为序列值的正确实现
需求:在二维数组中按垂直模式将1替换为1、2、3……直至指定数字,同时跳过值为0的元素。
初始数组:
1 1 1 1 1 1 0 0 1 1 1 1 0 0 1 1 1 1 0 0
期望替换为1-5后的结果:
1 5 3 5 1 2 0 0 1 2 3 1 0 0 3 4 2 4 0 0
错误尝试分析
尝试1:按行索引取序列值
代码:
int a[4][5] = {{1, 1, 1, 1, 1}, {1, 0, 0, 1, 1}, {1, 1, 0, 0, 1}, {1, 1, 1, 0, 0}}; int sequence[5] = {1, 2, 3, 4, 5}; for(int i=0; i<4; i++){ for(int j=0; j<5; j++){ if(a[i][j] == 1){ a[i][j] = sequence[i]; } } } for(int i=0; i<4; i++){ for(int j=0; j<5; j++){ cout << a[i][j] << " "; } cout << endl; }
输出:
1 1 1 1 1 2 0 0 2 2 3 3 0 0 3 4 4 4 0 0
问题:直接用行索引取序列值,同一行的所有1都被替换为相同值,完全没有实现垂直方向的填充逻辑。
尝试2:按行内1的顺序填充
代码:
int a[4][5] = {{1, 1, 1, 1, 1}, {1, 0, 0, 1, 1}, {1, 1, 0, 0, 1}, {1, 1, 1, 0, 0}}; int sequence[5] = {1, 2, 3, 4, 5}; for(int i=0; i<4; i++){ int z = -1; for(int j=0; j<5; j++){ if(a[i][j] == 1){ z ++; a[i][j] = sequence[z]; } } } for(int i=0; i<4; i++){ for(int j=0; j<5; j++){ cout << a[i][j] << " "; } cout << endl; }
输出:
1 2 3 4 5 1 0 0 2 3 1 2 0 0 3 1 2 3 0 0
问题:按行内的1依次填充序列值,是水平方向的填充,不符合需求中的垂直模式。
正确实现
要实现垂直模式填充,核心是按列优先遍历数组:对每一列从上到下遍历,遇到非0元素时,循环使用序列值填充,每填充一个非0元素,计数器自增(超过序列长度时取模循环)。
代码实现:
#include <iostream> using namespace std; int main() { int a[4][5] = {{1, 1, 1, 1, 1}, {1, 0, 0, 1, 1}, {1, 1, 0, 0, 1}, {1, 1, 1, 0, 0}}; int sequence[5] = {1, 2, 3, 4, 5}; const int seq_length = sizeof(sequence) / sizeof(sequence[0]); // 按列优先遍历数组 for (int j = 0; j < 5; j++) { int col_count = 0; for (int i = 0; i < 4; i++) { if (a[i][j] != 0) { a[i][j] = sequence[col_count % seq_length]; col_count++; } } } // 输出结果 for (int i = 0; i < 4; i++) { for (int j = 0; j < 5; j++) { cout << a[i][j] << " "; } cout << endl; } return 0; }
运行后输出与期望结果一致:
1 5 3 5 1 2 0 0 1 2 3 1 0 0 3 4 2 4 0 0
内容的提问来源于stack exchange,提问作者Lel
相关产品推荐
相关产品推荐

