c语言的练习—二维数组的练习(对称矩阵的判定)
对于此道题,所谓对称矩阵,意思就是关于左对角线对称的数字对应相等。
那么我们不妨使用我上一次发表的文章的方法来进行规律的寻找。
我们不妨使用题目中的第一个例子来举例
接下来我以图片的方式呈现出来
显然的,我们能够发现这两个三的位置和两个十二的位置,是不是恰巧 i 与 j 的数字交换位置了。
那么聪明的你是不是觉得找到真正的规律了。认为只需要 判断 sz[i][j]==sz[j][i]就可以了,这个先留在这里作为一个疑惑。
我们不妨验证一下。(我改变了一下我的代码以完成这步的探究)、
这里给出错误的代码图片
(后面我讲解正确算法时,我再逐步分解编写代码的过程)
这里是其输出,确实的,这个矩阵很明显是一个对称矩阵,但是我们不需要如此之多的yes,我们只需要一个yes,就可以了。但是如何解决这个问题呢,其实是非常简单的,在学习c语言的时候,我们曾经学过如何判断一个数是素数,这个的做法与其很相似,我们当时定义了一个变量,这里不妨设为a,给a赋值为1。a=1,如果这个数n与2到n-1的数取余不等于零我们说这个a=1,否则a=0,注意在这里设置a为全局变量,否则我们后续将无法使用这个a。于是我们使用这个a来做判断,如果a=1,那么这个数是素数,如果a=0,那么就不是,这样就解决了多个yes的问题了。
注意 判断时, if(a==1),里面是两个等于号才代表判断,否则代表赋值。
那么这道题,我们使用同样的思想,这里我不妨给出完整的代码。
#include<stdio.h>
int main(){
int n;
int sz[25][25];//在定义数组时,多定义几个位置,为了防止数组越界,并且有助于算法的实现。
int statistic=0; //统计数字,我用的变量就是这个英文单词的意思,是不是很明确呢。
while(scanf("%d",&n)!=EOF){//这里实现多组输入
if(n==0) break;//满足题目要求
else {
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&sz[i][j]);
}
}
statistic=0;//在多组输入的过程中,要更新这个数字的值,否则会产生错误。
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(sz[i][j]==sz[j][i]){
statistic++;
}
}
}
if(statistic==n*n){
printf("yes\n");
} else{
printf("no\n");
}
}
}
return 0;
}
接下来是核心代码的解读
if(statistic==n*n){
printf("yes\n");
} else{
printf("no\n");
}
我这里为什么要判断是n*n,其实就是n平方的意思,我们想如果这个矩阵是一个对称矩阵,那么对称位置上的数字都是相等的。除去这些对称位置上的数字,就剩下了,正对角线的数字,这些数字的 i , j 都是相同的,也就是判断它们是不是等于它们本身,显然是的。
所以也就是 statistic这个变量等于这个矩阵中一共有多少个数字,那么这个矩阵就一定是一个对称矩阵,否则就不是一个对称矩阵。
对于我的算法而言,我作为一个初学者,目前只能够做到O(n*n) ,我相信一定会有更优质的算法,能够降低时间复杂度。
但是我尚未学习。仅能够做到现在的程度。我想当我学到的时候,我可能会联想到这一题吧,到时候再给出更优解。
说到这里,这道题的讲解就结束了,感谢您的阅读!
如果您觉得小白作者的思路还可以的话,不妨给我留下一个免费的点赞,支持一下萌新作者我吧。
谢谢啦
