C语言-二维数组

文章介绍了二维数组的初始化规则,强调了列数不可省略的原因。接着展示了如何进行矩阵转置,以及通过两次操作(行交换和转置)实现3x3矩阵顺时针旋转90度。最后,详细阐述了两种方法实现按回型路线遍历二维数组,包括按圈填充和模拟行走路径的方法。
摘要由CSDN通过智能技术生成

1.初始化(可以省略行,不可以省略列

int arr[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};

 int arr[3][4]={1,2,3,4,5,6,7};

 int arr[3][4]={ {1,2},{3,4},{4,5} };

 二维数组在内存中是连续存放的;一行内部连续,跨行也是连续的。

也解释了为什么列不能省略,要知道从哪开始放第二行,而行数可以省略,只要把这样元素放完即可。

**数组为什么要开大一点👇

 如右图所示就算是越界访问了

 

 例一:矩阵转置

 

 对角线数字不改变 观察对角线上方数字 行标小于列标

#include <stdio.h>
int main()
{
	int a[][3] = 
	{
		8,1,6,3,5,7,4,9,2
	};
	for(int i=0;i<3;i++){
		for(int j=1+i;j<3;j++){
		//交换a[i][j] a[j][i]
		int t=a[i][j];
		a[i][j]=a[j][i];
		a[j][i]=t;	
		}
	}
		for(int i=0;i<3;i++ ){
			for(int j=0;j<3;j++){
				printf("%d ",a[i][j]);
			}
			printf("\n");
		}
	return 0;
}

例二:将3*3的矩阵顺时针旋转90度输出

 思路参考csdn搜到的想法

//F:旋转矩阵
#include <stdio.h>
int main()
{
	int a[4][4],b[4][4];

	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			scanf("%d",&a[i][j]);
		}	
	}
	//交换1 3行
	for(int i=0;i<3;i++){
		int t=a[0][i];
		a[0][i]=a[2][i];
		a[2][i]=t;
		}
	//再矩阵转置
		for(int i=0;i<3;i++){
			for(int j=0;j<3;j++){
			int t=a[i][j];
			a[i][j]=b[j][i];
			b[j][i]=t;
			}
		}
	for(int j=0;j<3;j++){
		for(int i=0;i<3;i++){
			printf("%d ",b[j][i]);
		}
		printf("\n");
	}
		return 0;
	}
	

例三:按回型路线遍历二维数组

     

           

 方法一:

          按圈填数,一圈4条边(用j来表示)

一定要注意边界!!!

上边:从左到右, 第i行,   列数j从i到n-i,输出a[i][j]

右边:从上到下,第n-i+1列,行数j从i到n-i,输出a[j][n-i]

下边:从右到左,第n-i+1行,列数j从n-i+1到i+1,输出a[n-i+1][j]

左边:从下到上,第i列,行数j从n-i+1到i+1,输出a[j][i]

#include <stdio.h>
int main()
{
	int n,a[15][15];
	scanf("%d",&n);
	for(int i=1;i<=n;i++){//圈数和输入的n有关,奇数情况还漏掉了一个最中心的元素
		for(int j=1;j<=n;j++){
			scanf("%d",&a[i][j]);
		}	
	}
	for(int i=1;i<=n/2;i++){
		//最上边
		for(int j=i;j<=n-i;j++){
			printf("%d\n",a[i][j]);
		}
		//最右边
		for(int j=i;j<=n-i;j++){
			printf("%d\n",a[j][n-i+1]);
		}
		//最下边
		for(int j=n-i+1;j>=i+1;j--){
			printf("%d\n",a[n-i+1][j]);
		}
		//最左边
		for(int j=n-i+1;j>=i+1;j--){
			printf("%d\n",a[j][i]);
		}
	}
	if(n%2==1){//奇数情况
		printf("%d",a[n/2+1][n/2+1]);
	}
	return 0;
}

方法二:模拟行走路线,填充,走到边界处就拐弯

intd[x]={0,1(行数加一),0,-1};//行偏移(右下左上)

intd[y]={1,0,-1,0}//列偏移

起始位置:x=1,y=1(第一行第一列开始),方向参数m=0

周期为4,m=m+1

何时拐弯?

看到0就拐弯,访问过的数全部变成0

                

  • 9
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值