题目内容:
判断一个 N 阶整型矩阵是否为对称矩阵。要求矩阵用一维数组存储。
输入格式:
N+1 行,第 1 行:数字 N(10>n>0);第 2-(N+1) 行:N 阶方阵的元素
输出格式:
“Yes” 或 “No”
输入样例:
4
5 6 7 9
2 8 5 4
3 7 16 15
1 4 8 11
输出样例:
No
#include<iostream>
using namespace std;
bool f(int a[],int n){
int i, j;
int flag = 1; //用作标记对角线元素的下一个
int count;//用于比较
for( i=0; i<n*n-n; i=i+n){//n-1次循环,最后一行不需要比较
count = 1;
for( j=i+flag; j<i+n; j++){//每行只比较对角线右侧的元素
if(a[j]!=a[j+count*(n-1)]) return false;//只要发现一个不相等就不再继续
count ++;
}
flag ++;
}
return true;
}
int main(){
int a[100];
int n;
cin>>n;
for(int i=0; i<n*n; cin>>a[i++]);//按行输入矩阵
// for(int i=0; i<n*n; cout<<a[i++]<<" ");
if(f(a,n)) cout<<"Yes";
else cout<<"No";
return 0;
}
算法分析:
题目要求使用一维数组存储,关键在于找到比较元素的位置,做到不重复比较,以 4 阶矩阵 a [16] 为例,从 a [0] 到 a [15] 一共 16 个元素,由相似矩阵的性质可知对角线元素 a [0]、a [5]、a [10]、a [15] 不需要比较,矩阵第 n 行最后一行也不需要比较,这里选择对角线右侧对 [左侧进行比较即 a [1] 和 a [4] 比较 a [2] 和 a [8]… 从中递推出在每一行中对角线右侧的第 1 个元素 a [j] 应与 a [j+n-1],第二个元素 a [j+1] 与 a [j+1+2*(n-1)] 比较,以此类推。