首页 > 试题广场 >

上三角矩阵判定

[编程题]上三角矩阵判定
  • 热度指数:28065 时间限制: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,i,j,flag=1;
    int a[10][10];
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=1;i<n;i++)
    {
        for(j=0;j<i;j++)
        {
            if(a[i][j]!=0)
            {
                flag=0;
            }
        }
    }
    if(flag)
        printf("YES\n");
    else
        printf("NO\n");
    return 0;
}

发表于 2021-07-14 19:43:08 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int[][] arr=new int[n][n];
        int flag=1;
        for (int i=0;i<n;i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = sc.nextInt();
            }
            sc.nextLine();
        }
        for (int i=0;i<n;i++){
            for (int j=0;j<i;j++){
                if(arr[i][j]!=0){
                    flag=0;
                }
            }
        }
        if(flag==1){
            System.out.println("YES");
        }else {
            System.out.println("NO");
        }
    }
}

发表于 2020-06-02 14:58:33 回复(0)
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int flag;
    int i, j, n;
    
    scanf("%d", &n);
    int (*a)[n] = (int (*)[n])malloc(sizeof(int) * n * n);
    if (NULL == a)
    {
        fprintf(stderr, "Memory allocation failed!\n");
        exit(EXIT_FAILURE);
    }
    for (i = 0; i < n; i++)
    {
        for (j = 0; j < n; j++)
        {
            scanf("%d", &a[i][j]);
        }
    }
    flag = 1;
    for (i = 1; i < n; i++)
    {
        for (j = 0; j < i; j++)
        {
            if (a[i][j] != 0)
            {
                flag = 0;
                break;
            }
        }
    }
    printf("%s\n", 1 == flag ? "YES" : "NO");
    free(a);
    a = NULL;
    
    return 0;
}

编辑于 2020-04-19 22:51:27 回复(0)
#include<stdio.h>
int main(){
    int n,flag=1;
    scanf("%d",&n);
    int a[n][n];
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            if(i-j>0){//当i-j>0时,a[i][j]为下三角的元素
                if(a[i][j]!=0)
                    flag=0;
            }
        }
    }
    if(flag)
        printf("YES");
    else printf("NO");
    return 0;
}

发表于 2021-04-10 14:58:21 回复(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 a[15][15],b[15][15];
    int i,j,n,m,flag=1;
    scanf("%d",&n);
    for(i=0;i<n;i++){
        for(j=0;j<n;j++){
            scanf("%d",&a[i][j]);
            if(i>j&&a[i][j]){
                flag=0;
            }
        }
    }
    if(flag) printf("YES\n");
    else printf("NO\n");
}

发表于 2020-04-10 18:46:22 回复(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)
import java.util.Scanner;

// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int[][] matrix = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                matrix[i][j] = in.nextInt();
            }
        }

        boolean flag = true;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                if (matrix[i][j] != 0) {
                    flag = false;
                }
            }
        }

        if (flag) System.out.println("YES");
        else System.out.println("NO");
    }
}

发表于 2025-07-29 19:56:49 回复(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<bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int arr[n][n],arr_num;
    int flag = 1,count = 0,count_s = 0;
    for(int i = 0;i<n;i++){
        for(int j = 0;j<n;j++){
            cin>>arr_num;
            arr[i][j] = arr_num;
            if(i>j && arr[i][j] == 0){
                flag = 0;
                //统计0出现的个数
                count++;
            }
        }
    }
    //求正常0出现的个数
    for(int m = 0;m<n;m++){
        count_s += m;
    }
    //判断比较
    if(flag == 0 && count == count_s){
        cout<<"YES"<<endl;
    }
    else
        cout<<"NO"<<endl;
}

发表于 2020-10-02 21:34:11 回复(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)
n = int(input())
t =[]
for _ in range(n):
    a = list(map(int,input().split()))
    t.append(a)
for i in range(n):
    for j in range(i):
        if int(t[i][j]) != 0:
            print("NO")
            exit()
print("YES")

发表于 2025-11-12 12:48:11 回复(0)
#include <iostream>
using namespace std;
#include<vector>
int main() {
    int n;
    cin>>n;
    vector<vector<int>>v(n,vector<int>(n));
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            int a;
            cin>>a;
            v[i][j]=a;
        }
    }
    bool flag=1;
    for(int i=1;i<n;i++){
        for(int j=0;j<i;j++){
              if(v[i][j]!=0){
               flag=0;
              }
        }
    }
    if(flag==1){
        cout<<"YES"<<endl;
    }
    else{
        cout<<"NO"<<endl;
    }
}

发表于 2025-11-05 17:02:47 回复(0)
import sys

arrs = [list(map(int,line.strip().split())) for line in sys.stdin][1:]

flag = True
for i in range(len(arrs)):
    for j in range(i):
        if i==0:
            continue
        if arrs[i][j]:
            flag=False
if flag:
    print("YES")
else:
    print("NO")

发表于 2025-10-29 10:51:48 回复(0)
for i in range (int(input())): 
    if (list(map(int, input().split()))[0:i] != [0] * i): 
        print ("NO")
        break
else: 
    print ("YES")
简单粗暴,抓住本质
发表于 2025-10-14 15:03:54 回复(0)
如果第一个元素是0,对角线以下也都是0,那还是上三角矩阵吗?
发表于 2025-10-13 20:01:05 回复(0)
#include<iostream>
#include<vector>
using namespace std;
int main()
{
    int a;
    cin >> a ;
    int sum = 0;
    vector<vector<int>> sz(a+1, vector<int>(a+1));
    for (int i = 1; i <= a; i++)//行
    {
        for (int j = 1; j <= a; j++)//列
        {
            cin >> sz[i][j];
        }
    }
    for (int i = 1; i <= a; i++)
    {
        for (int j = 1; j <= a; j++)
        {
            if (i == j)
            {
                for (int z = i + 1; z <= a; z++)
                {
                    if (sz[z][j] == 0)
                    {
                        sum++;
                    }
                }
            }
        }
    }
    if (sum == (a * a - a) / 2)
    {
        cout << "YES" << endl;
    }
    else
    {
        cout << "NO" << endl;
    }
    return 0;
}

发表于 2025-10-09 13:29:14 回复(0)
#include <iostream>
#include <vector>
using namespace std;

int main() {
    int n;
    cin >> n;
    vector<int>square(n);
    bool iflegal = true;
    for(int i = 0 ; i < n ; i++){
        //在出现非法情况前不能跳过输入
        //反之有一个足以判断不合法的数据就可以跳过后续所有
        for(int j = 0 ; j < n ; j++){
            cin >> square[j];
            //只检查下三角部分的元素是否为0即可
            if(j < i){
                if(square[j]){
                    iflegal = false;
                    break;
                }
            }
        }
        if(!iflegal) break;
    }
    if(iflegal){
        cout << "YES" <<endl;
    }else{
        cout << "NO" <<endl;
    }
    return 0;
}

发表于 2025-10-05 18:10:21 回复(0)
n = int(input())
cnt = 0
for i in range(n):
    a = list(map(int, input().split()))
    for j in range(int(i)):
        if a[j] == 0:
            cnt += 1
        else:
            continue
if cnt == (n ** 2 -n)/2:
    print("YES")
else:
    print("NO")


发表于 2025-10-02 20:35:14 回复(0)

问题信息

上传者:牛客309119号
难度:
106条回答 2983浏览

热门推荐

通过挑战的用户

查看代码
上三角矩阵判定