首页 > 试题广场 >

上三角矩阵判定

[编程题]上三角矩阵判定
  • 热度指数:37485 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}牛牛想知道一个 n 阶方阵是否为上三角矩阵。所谓上三角矩阵,是指矩阵中主对角线以下的元素都为 0,其中主对角线是从矩阵左上角到右下角的连线。
\hspace{15pt}请你判断给定的方阵是否满足这一性质。

输入描述:
\hspace{15pt}在一行中输入一个整数 n \left(1 \leqq n \leqq 10\right)
\hspace{15pt}接下来 n 行,每行输入 n 个整数 a_{i,1},a_{i,2},\dots,a_{i,n} \left(-10^{9} \leqq a_{i,j} \leqq 10^9\right),用空格分隔。


输出描述:
\hspace{15pt}如果输入的方阵是上三角矩阵,则输出 \texttt{ (不含双引号)并换行;否则输出 \texttt{ (不含双引号)并换行。
示例1

输入

3
1 2 3
0 4 5
0 0 6

输出

YES

说明

该矩阵主对角线以下元素均为 0,因此是上三角矩阵。
示例2

输入

3
1 0 0
0 2 0
1 0 3

输出

NO

说明

该矩阵在第 3 行第 1 列元素为 1 \neq 0,故不是上三角矩阵。
#include <stdio.h>

int main()
{
    int n = 0;
    while (scanf("%d", &n) == 1)
    {
        int arr[n][n];
        int i = 0;
        int j = 0;
        for (i = 0; i < n; i++)
        {
            for (j = 0; j < n; j++)
                scanf("%d", &arr[i][j]);
        }
        for (i = 1; i < n; i++)
        {
            for (j = 0; j < i; j++)
            {
                if (arr[i][j] != 0)
                {
                    printf("NO\n");
                    goto next;
                }
            }
        }
        if (i == n)
        {
            printf("YES\n");
        }
        next:
        ;
    }
    return 0;
}
发表于 2026-02-03 12:29:16 回复(0)
#include <stdio.h>

int main () {
    int n, m;
    scanf ("%d", &n);
    for (int i = 0; i < n; i ++) {
		for (int j = 0; j < n; j ++) {
			scanf ("%d", &m);
			if (i > j && m != 0) {
				printf ("NO");
				return 0;
			}
		}
	}
	printf ("YES");
    return 0;
}

发表于 2026-01-18 23:49:24 回复(0)
#include <stdio.h>

int main() {
    int n;
    if (scanf("%d", &n) != 1 || 1 > n || n > 10) {
        return 1;
    }
    for (int i = 0; i < n; i += 1) {
        for (int j = 0; j < n; j += 1) {
            int a;
            if (scanf("%d", &a) != 1 || -1000000000 > a || a > 1000000000) {
                return 1;
            }
            if (i > j && a != 0) {
                printf("NO");
                return 0;
            }
        }
    }
    printf("YES");
    return 0;
}

发表于 2026-01-09 22:42:26 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d",&n);
    long long a[n][n];
    for(int i=0;i<n;i++)
         for(int j=0;j<n;j++)
             scanf("%lld",&a[i][j]);
    int flag=0;        
    for(int i=1;i<n&&flag==0;i++)
        for(int j=0;j<i;j++)
           if(a[i][j]!=0)
           {
               flag=1;
           }
    if(flag==0)
        printf("YES");
    else
        printf("NO");
}
发表于 2026-01-03 19:39:50 回复(0)
#include <stdio.h>
int main()
{
    int n=0;
    scanf("%d",&n);
    long long a[n+1][n+1];
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%lld",&a[i][j]);
        }
    }
    //怎么检查
    if(n==1)
    {
        printf("YES");
    }
    else if(n>1)
    {
        for(int i=1,sum=0;i<n;i++)//噢噢噢噢,神来之笔
        {   
            for(int j=0;j<i;j++)
            {
                if(a[i][j]!=0)
                {
                    sum++;
                }
            }
            if(i==n-1)
            {
                if(sum!=0)
                {
                    printf("NO");
                }
                else if(sum==0)
                {
                    printf("YES");
                }
            }
        }
    }
    return 0;
}
我觉得最有趣的是这一段
for(int i=1,sum=0;i<n;i++)//噢噢噢噢,神来之笔
        {   
            for(int j=0;j<i;j++)
            {
                if(a[i][j]!=0)
                {
                    sum++;
                }
            }
            if(i==n-1)
            {
                if(sum!=0)
                {
                    printf("NO");
                }
                else if(sum==0)
                {
                    printf("YES");
                }
            }
        }
就是实现判断对角线下是否全是0的这一步;
设一个数,初始化为0,每当矩阵对角线下有非0出现时就++,最后判断这个数是否大于0。

楼主经验不足,写的代码只能说是能跑,没有技术性可言,这里只不过是因为突然想出了一个好主意,想要分享而已。望大家多多包涵,欢迎大家积极评论(≧∀≦)ゞ
发表于 2025-11-24 20:12:38 回复(0)
#include <stdio.h>

int main() {
    int n, arr[100][100];
    scanf("%d\n", &n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            scanf("%d", &arr[i][j]);
        }
    }
    int k = 1;
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (arr[i][j] != 0) {
                k = 0;
                break;
            }
        }
        if (!k)break;
    }
    printf("%s\n", k ? "YES" : "NO");
}
发表于 2025-11-15 17:45:11 回复(0)
#include <stdio.h>
int main(){
    int n;
    scanf("%d",&n);
    long long arr[n][n];
    int ok=1;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%lld",&arr[i][j]);
        }
    }
    for(int i=1;i<n;i++){
        if(ok==0){
            break;
        }
        for(int j=0;j<i;j++){
            if(arr[i][j]!=0){
                ok=0;
                break;
            }
        }
    }
    if(ok) printf("YES");
    else printf("NO");

   
}
发表于 2025-11-06 21:42:32 回复(0)
#include <stdio.h>
#include<stdbool.h>
int main() {
    int a[10][10];
    int row, i, j;
    //int b=1;
    bool b=true;
    scanf("%d", &row);
    for (i = 0; i < row; i++) {
        for (j = 0; j < row; j++) {
            scanf("%d", &a[i][j]);
            if (i > j && a[i][j] != 0) {
                b = false;
                break;
            }
        }
        if(!b)
        break;
    }
    printf(b?"YES":"NO");
    return 0;
}
发表于 2025-07-21 23:23:05 回复(0)
#include <stdio.h>

int main() {
    int n=0;
    scanf("%d",&n);
    int i=0;
    int arr[n][n];
    for (i=0; i<n; i++) {
        int j=0;
        for (j=0; j<n;j++) {
            scanf("%d",&arr[i][j]);
        }
    }
    for (i=1; i<n; i++) {
        int j=0;
        for (j=0; j<i;j++) {
            if (arr[i][j]!=0) {
                printf("NO\n");
                return 0;
            }
        }
    }
    printf("YES\n");    
    return 0;
}

发表于 2024-06-16 19:45:16 回复(0)
#include <stdio.h>

int main() {
    int n=0;
    int arr[10][10]={0};
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    //判断
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i>j)
            {
                if(arr[i][j]!=0)
                {
                    printf("NO\n");
                    return 0;
                }
            }
        }
    }
    printf("YES\n");
    return 0;
}

发表于 2024-01-24 22:38:11 回复(0)
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int main()
{
    int n = 0;
    int count = 0;
    scanf("%d", &n);
    int arr[100] = { 0 };
    for (int i = 1; i <= n * n; i++)
    {
        scanf("%d", &arr[i]);
    }
    int b = n + 1;
    for (int i = 1; i < n; i++)
    {
        int a = i;
        int c = b;
        while (a)
        {
            if (arr[c]==0)
            {
                count++;
                c++;
            }
            a--;
        }
        b += n;
    }
    if (count == (n * (n - 1)) / 2)
    {
        printf("YES");
    }
    else
    {
        printf("NO");
    }
    return 0;
}
编辑于 2024-01-23 20:43:52 回复(1)
#include<stdio.h>

int main()
{
    int n = 0;
    int i = 0;
    int arr[10][10] = {0};
    scanf("%d",&n);
    for(i = 0;i<n;i++)
    {
        int j = 0;
        for(j = 0;j<n;j++)
        {
            scanf("%d ",&arr[i][j]);
            if(i>j && arr[i][j] != 0)//边输入边判断
            {
                printf("NO\n");
                return 0;
            }
        }
    }
    printf("YES\n");

    return 0;
}

发表于 2023-07-22 17:00:04 回复(0)
#include <stdio.h>

int ADD(int n) {
    if (n == 1) return 1;
    else return n + ADD(n - 1);
}
int main() {
    int n = 0, sum = 0;
    scanf("%d", &n);
    int arr[n * n];
    for (int i = 0; i < n * n; i++) {
        scanf("%d", &arr[i]);
    }
    for (int i = 1; i < n; i++) {
        for (int j = 0; j < i; j++) {
            if (arr[i * n + j] == 0) {
                sum++;
            }
        }
    }
    if (sum == ADD(n - 1)) printf("YES\n");
    else printf("NO\n");
    return 0;
}

发表于 2023-03-22 13:03:36 回复(0)
#include <stdio.h>

int Judge(long long arr[10][10],int n)
{
    int count = 0;
    int i = 0;
    for(i = 1;i < n;i++)
    {
        int j = 0;
        for(j = 0;j <= i;j++)
        {
            if(arr[i][j] == 0) 
            {
                count++;
            }                             
        }
    }
    if(count == ((n * (n - 1)) / 2))
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

int main() 
{
    int n = 0;
    scanf("%d", &n);
    long long arr[10][10];
    int i = 0;
    for(i = 0;i < n;i++)
    {
        int j = 0;
        for(j = 0;j < n;j++)
        {
            scanf("%lld", &(arr[i][j]));
        }
    }
    int res = Judge(arr,n);
    if(res == 1)
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
    return 0;
}

发表于 2022-11-22 16:04:58 回复(0)
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d",&n);
    int arr[n][n];
    int i = 0;
    for(i = 0;i<n;i++)
    {
        int j = 0;
        for(j = 0;j<n;j++)
        {
            scanf("%d",&arr[i][j]);
        }
    }
    int flag = 1;
    for(i = 1;i<n;i++)
    {
       int j = 0;
        for(j = 0;j<i;j++)
        {
           if(arr[i][j]!=0)
           {
               flag = 0;
           }
        }
    }
    if(flag == 1)
        printf("YES\n");
    else
        printf("NO\n");
    
    return 0;
}
发表于 2022-07-19 22:33:54 回复(0)
#include<stdio.h>

//解题思路:录入元素的同时判断是否为上三角矩阵
int main()
{
    int n;
    scanf("%d",&n); //获取n
    int arr[n][n];
    int i,j;
    int flag = 1;
    for(i = 0; i < n; i++)  //输入n*n元素
    {    
        for(j = 0; j < n; j++)
        {
            scanf("%d",&arr[i][j]);
            if(i > j) //i>j时为下三角的元素
            {
                if(arr[i][j] != 0){ //下三角元素中有不是0的
                    flag = 0; //标志不为上三角矩阵                
                    //break 
                }    
            }         
        }
        //if(flag == 0) break;
        //Note: 上面两个break语句其实可以直接退出循环并达成输出正确的结果
        //      但是不满足题目的输入描述:共输入n*n个元素
    }  
    printf("%s",(flag?"YES":"NO"));
    
    return 0;
}

发表于 2022-07-16 11:18:52 回复(0)
#include <stdio.h>
int main()
{
    int n = 0;
    scanf("%d", &n);
    
    int arr[10][10] = {0};
    int i = 0;
    int j = 0;
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    
    int flag = 0;
    for (i = 1; i < n && flag == 0; i++)
    {
        for (j = 0; j < i; j++)
        {
            if (arr[i][j])
            {
                flag = 1;
                break;
            }
        }
    }
    
    if (flag)
    {
        printf("NO\n");
    }
    else
    {
        printf("YES\n");
    }
    return 0;
}

发表于 2022-05-25 14:36:05 回复(0)
#include<stdio.h>
int main()
{
    int arr1[10][10] = { 0 };
    int n= 0,flag=0;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            scanf("%d\n", &arr1[i][j]);
            if (arr1[i][j] == 0 && j < i)
            {
                flag += 1;
            }
        }
    }
    if (flag == n*(n-1)/2)//数0的个数
    {
        printf("YES\n");
    }
    else
    {
        printf("NO\n");
    }
}
发表于 2022-05-09 09:41:50 回复(0)