C语言矩阵问题

突然想到矩阵问题还没弄透,通过这次机会总结优化一下

一.

矩阵是非常美妙的东西,可以用来解方程,以及解决一些图论的问题等,应用很广泛。即使没有学过线性代数,大家也一定接触过矩阵,在编程中可以理解为二维的表。矩阵有很多操作就像舞蹈一样,如行列的置换,矩阵的转置等。今天我们只看矩阵的旋转,希望得到当前矩阵顺时针旋转90度以后得到的矩阵。

Input

输入数据的第一行是一个正整数T,代表有T组测试样例。接下来T组数据,每组数据第一行是两个整数M,N (0 < M , N < 100),分别代表矩阵的行数和列数。然后是矩阵本身,共M行,每行N个数据用空格隔开。

Output

对于每组输入的矩阵,第一行输出Case #k:(k为该组数据的序号,具体格式见样例),然后输出其旋转后的矩阵。

Examples

input

2
4 4
1 2 3 4
5 6 7 8
6 6 6 6
8 8 8 8
2 3
1 2 3
4 5 6

output

Case #1:
8 6 5 1
8 6 6 2
8 6 7 3
8 6 8 4
Case #2:
4 1
5 2
6 3

这题简单了来说就是要求当前矩阵顺时针旋转90度以后得到的矩阵。

 看题目要先观察啊,不难发现,经过旋转,第一列成了第一行,第二列变成了第二行,

这样就好办了,因为输出时一行一行输出,代码如下

​
#include<stdio.h>
int main()
{
	int n,x,y,a[1000][1000];
	scanf("%d",&n);//输入要测试的组数
	for(int z=1;z<=n;z++)//循环n次
	{
		scanf("%d %d",&x,&y);//x行y列

		for(int i=0;i<x;i++)//输入数组
		{
			for(int j=0;j<y;j++)
			scanf("%d ",&a[i][j]);
		}

		printf("Case #%d:\n",z); 

		for(int q=0;q<y;q++)//列在外层循环
		{
			for(int w=x-1;w>=0;w--)
			printf("%d ",a[w][q]);
			printf("\n");
		}
	}
}

​

二.

输入一个正整数n(1<=n<=10),再输入n*n的矩阵,要求求该矩阵的下三角元素之和。

Input

输入包括n+1行。
第一行为整数n;
接下来的n行为矩阵数据。

Output

矩阵的下三角元素之和。

Examples

input

5
1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
5 6 7 8 9

output

75

由题意可得,矩阵一定为方阵,对于二维数组a[i][j],下三角就是i>=j时,可得

if(i>=j) sum+=a[i][j];

#include<stdio.h>
int main()
{
	int sum=0,n,a[100][100];
	scanf("%d",&n);
	for(int i=0;i<n;i++)//依旧是二层循环写二维数组
	{
		for(int j=0;j<n;j++)
		{
			scanf("%d",&a[i][j]);
		}
	}

		for(int i=0;i<n;i++)//对二维数组的元素一个一个判断
	{
		for(int j=0;j<n;j++)
		{
			if(i>=j)
			sum=sum+a[i][j];
		}
	}
	printf("%d",sum);
}

三.

输入矩阵的行数,再依次输入矩阵的每行元素,判断该矩阵是否为对称矩阵,若矩阵对称输出“yes",不对称输出”no“。

Input

输入有多组,每一组第一行输入一个正整数N(N<=20),表示矩阵的行数(若N=0,表示输入结束)。
下面依次输入N行数据。

Output

若矩阵对称输出“yes",不对称输出”no”。

Examples

input

3
6 3 12
3 18 8
12 8 7
3
6 9 12
3 5 8
12 6 3
0

output

yes
no

对称矩阵,即a[i][j]==a[j][i];因为n==0时退出,可以使用break

#include<stdio.h>
int main()
{
	int n,a[100][100];
	while(scanf("%d",&n)!=EOF)
	{
		int flag=0;//判断是否是对称矩阵,如果有一个不符合的,则flag改变
		if(n==0)
		break;
		else
		{
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				scanf("%d",&a[i][j]);
			}
		}
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				if(a[i][j]!=a[j][i])
				flag=1;
				break;
			}
		}
		if(flag==0)
		printf("yes\n");
		else
		printf("no\n");
		}
	}
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值