题目:判断上三角矩阵
问题描述 上三角矩阵指主对角线以下的元素都为 0 的矩阵;主对角线为从矩阵的左上角至右下角 的连线。 本题要求编写程序,判断一个给定的方阵是否上三角矩阵。
输入格式 第一行给出一个正整数 T,为待测矩阵的个数。接下来给出 T 个矩阵的信息:每个矩阵 信息的第一行给出一个不超过 10 的正整数 n。随后 n 行,每行给出 n 个整数,其间以空格 分隔。
输出格式 每个矩阵的判断结果占一行。如果输入的矩阵是上三角矩阵,输出“YES”,否则输出“NO”。
样例输入
3
3
1 2 3
0 4 5
0 0 6
2
1 0
-8 2
3
1 2 3
1 4 5
0 -1 6
样例输出
YES
NO
NO
代码实现
#include <stdio.h>
int main() {
int t, n, a[101][101];
scanf("%d", &t);
for (register int i = 1; i <= t; i++) {
int flag = 1;//判断是否符合题目条件
scanf("%d", &n);
for (register int j = 1; j <= n; j++) {
for (register int k = 1; k <= n; k++) {
scanf("%d", &a[j][k]);
}
}
if (n == 1 ) {//特判只有一个数的情况
printf("YES\n");
continue;//进入下一矩阵
}
int pos1 = 2, pos2 = 1, pos3 = 2;
while (pos1 <= n) {//条件是还在矩阵范围内
if (a[pos3][pos2] != 0) {
flag = 0;//有不为零的数
break;
}
//斜着遍历下三角
if (pos2 > (n - pos1 + 1)) {//观察规律斜向遍历时当列数到达n-行数+1时达到末尾
//大于是因为在上一次循环末尾pos2已经加一,如果不是大于可能会在遍历左下角最后一个点时出现错误
pos2 = 1;//回到第一列
pos1++;//向下移一行,pos1用于标记在哪一行
pos3 = pos1;//复制行数用于移动
continue;
}
pos2++;//列数加一的同时行数加一达到斜向遍历的目的
pos3++;
//printf("pos1:%d n-pos1+1:%d %d %d %d\n", pos1, n - pos1 + 1, pos3, pos2, a[pos3][pos2]);//测试数据时可用于观察
}
if (flag == 0) {
printf("NO\n");
} else {
printf("YES\n");
}
}
return 0;
}