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)。
第二行输入 mn 个整数(不小于 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);
}