C语言【二维数组】矩阵问题(XDOJ)

本文介绍了C语言中二维数组的使用,包括指向二维数组的指针、地址概念的应用,以及如何进行S型排序(之字形排序)和M型排序。同时,还探讨了如何判断和处理上三角矩阵及其元素的计算。
摘要由CSDN通过智能技术生成

C语言【二维数组】矩阵问题(XDOJ)

补充知识

指向二维数组的指针

int a[3][4];
int (p)[4] //行指针,指向有四个列元素的一维数组(列不可缺省)
p=a;p=a[0];p=a[1];
p[i][j]<=>(p[i]+j)<=>(
(p+i)+j)<=>*(p+i)[j]
推荐使用p[i][j]

地址概念

  • a[0],a[1]–一维数组名,数组名代表元素首地址
  • a[0]<->&a[0][0] a[1]<->&a[1][0]

实际应用

实际应用中,一维数组也能实现矩阵输出,如前两个例子

S型/之字排序

%3d格式控制

问题描述
对于两个正整数 m、n(2≤m、n≤7),现有 mn 个整数(不小于 0,且小于 100),编
写程序完成这些数据从小到大的 S 型放置任务。
输入格式
第一行输入两个正整数 m、n(2≤m、n≤7)。
第二行输入 m
n 个整数(不小于 0,且小于 100)。
输出格式
输出处理后的 S 型数据矩阵,每个数据使用%3d 格式输出,每 n 个换一行,最后一行
不换行。

#include <stdio.h>

int main()
{
	int m,n,i,j;
	int a[100]; 
	scanf("%d %d",&m,&n);
	for(i=0;i<m*n;i++)
    scanf("%d",&a[i]);
    for(i=0;i<m*n-1;i++)
    {
    	for(j=i+1;j<m*n;j++)
    	{
    		if(a[j]<a[i])
    		{
    			int t;
    			t=a[j];
    			a[j]=a[i];
    			a[i]=t;
			}
		}
	}
	for(i=0;i<m;i++)
	{
		if(i%2==0)
		{
			for(j=(i+1)*n-1;j>=i*n;j--)
			printf("%d ",a[j]);
		    printf("\n");
		}
		if(i%2!=0)
		{
			for(j=i*n;j<(i+1)*n;j++)
			printf("%d ",a[j]);
		    printf("\n");
		}
	}
}

M型排序

编写子函数程序对一个包含 M×N 个数据的一维数列,按照 M 字形升序排列任务。
要求与说明:
1.)按照 M×N 矩阵形式排序的 M 字形,正整数 M、N 分别表示矩阵的行数和列数。
2.)矩阵各个元素均为 10 以内的个位正整数。
3.)子函数 void sort(int *p,int,int),参数依次为指向一维数列的指针、输出矩阵行数、
输出矩阵列数。
4.)主函数输入、子函数输出

#include <stdio.h>

 void sort(int *p,int m,int n)
 {
 	int i,j,t;
 	for(i=0;i<m*n-1;i++)
    {
    	for(j=i+1;j<m*n;j++)
    	{
    		if(p[i]>p[j])
    		{
    			int t;
    			t=p[j];
    			p[j]=p[i];
    			p[i]=t;
			}
		}
	}//所有元素升序排序 
	for(i=0;i<m;i++)//行 
 	{
 		for(j=0;j<n;j++)//列 
 		{
 			if(j%2==0)//偶数列 
 			printf("%d ",p[(j+1)*m-i-1]);
 			if(j%2!=0)//奇数列 
 			printf("%d ",p[j*m+i]);
		}
		printf("\n");
    }
}
int main()
{
	int m,n,i;
	scanf("%d %d",&m,&n);
	int a[65];
	for(i=0;i<m*n;i++)
	scanf("%d",&a[i]);
	sort(a,m,n);
	return 0;
}

上三角矩阵

主对角线(图中红色虚线)以下都是零的方阵称为上三角矩阵,如下图(a)是上三角矩阵,(b)不是上三角矩阵。给出一个n行n列的方阵,判断是不是上三角矩阵,如果是则求出上三角元素和,如果不是则统计下三角非零元素个数。
在这里插入图片描述

#include <stdio.h>

int main()
{
	int n,i,j,count=0,sum=0;
	scanf("%d",&n);
	int m[50][50];
	for(i=0;i<n;i++)
	{
		for(j=0;j<n;j++)
		{
			scanf("%d",&m[i][j]);
		}
	}//输入矩阵 
	for(i=1;i<n;i++)//行 
	{
		for(j=0;j<i;j++)//列 
		{
			if(m[i][j]!=0)
			{
				count++;
			}
		}
	}//判断下三角矩阵元素是否全为0 
	if(count==0)
	{
		for(i=0;i<n-1;i++)//行 
		{
			for(j=i+1;j<n;j++)//列 
			{
				sum+=m[i][j];
			}
		}
	}//上三角矩阵元素求和 
	if(count==0)
	printf("%d",sum);
	else
	printf("%d",count);
}

总结-二维数组的运用

在这里插入图片描述

  • 17
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值