1.简介
二维数组的交换可以作为动态规划问题的基础,本文将详细讲述二维数组交换问题,以便读者后期更容易理解动态规划问题。
2.二维数组的声明格式
int num[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12};
如此代码段,声明了一个三行四列的二维数组。我们可以把他理解为一个矩阵。
注意:数组是从0开始的。及元素1对应的是num [0][0];这点和坐标很相似
3.对二维数组元素的输出
这里我们首先用一维数组的元素输出进行类比
我们首先定义一个一维数组然后用这个例子来类比二维数组。我们使用一个变量i来控制数组元素的输出。
int a[3]={1,2,3}; for ( i = 0; i < 3; i++) { printf("%d",a[i]); }
接下来我将说明二维数组的输出方法
结合下图我们来直观的理解下二维数组的位置关系。我们可以看出i[0][0]是初始的第一排,然后我们把二维数组看成两个一维数组。
如图所示,我们直观看到,我们对二维数组num[i][j]进行遍历需要改变i和j的值。也就是两个for循环进嵌套,外层控制行,内层控制列。代码如下:
int num[3][4] ={1,2,3,4,5,6,7,8,9,10,11,12}; int i,j; for ( i = 0; i < 3; i++) { for ( j = 0; j < 4; j++) { printf("%d\t",num[i][j]); } printf("\n\n"); }
4.二维数组的行列转换
4.1思路介绍
(1)这里先介绍一下红酒杯交换法 。我们想把A,B两个酒杯内的液体互换,这时候我们需要一个空酒杯C,先把A中液体倒进C,然后把B中液体倒进A,然后在把C中液体倒进B。
(2)同理我们可以利用一个中间变量储存num [1][2]的值然后进行取赋给一个变量,然后在把他的镜像num [2][1]的值赋给他,最后将常量赋值回去。这就完成了互换。
示意图如下:
4.2代码实现
详细解释见注释:
/* 实现二维数组的翻转 */ #include<stdio.h> int main(int argc, char const *argv[]) { int num[3][3]={ //声明一个二维数组 {1,2,3}, {4,5,6}, {7,8,9}}; int i,n,cunt; //i,n进行行和列的计算,cunt进行承接 for (i = 0; i < 3; i++)//打印原数组 { for ( n = 0; n < 3; n++) { printf("%d ",num[i][n]); } printf("\n"); } for ( i = 0; i < 3; i++)//进行行的遍历 { for( n = i; n < 3; n++)//进行列的遍历 { cunt=num [i][n]; //对空酒杯赋值 num [i][n]=num [n][i];//交换 num [n][i]=cunt; //再次赋值交换完毕 } } printf("\n\n"); for (i = 0; i < 3; i++) //打印输出 { for ( n = 0; n < 3; n++) { printf("%d ",num[i][n]); } printf("\n"); } return 0; }