hero-image
Last updated on

2022级《程序设计基础I》实验6-二维数组


求一个3*3矩阵对角线元素之和

problemId:1185

Description

给定一个3*3的矩阵,请你求出对角线元素之和。

Input

按照行优先顺序输入一个3*3矩阵,每个矩阵元素均为整数。

Ouput

从左下角到右上角这条对角线上的元素之和

samples

<input>—> 1 2 3 3 4 5 6 0 1 <output>—> 13

Code

#include<stdio.h>

int main()
{
    int arr[3][3];
    int result=0,i,j;
    for(i=0;i<3;i++)
    	for(j=0;j<3;j++)
        	scanf("%d",&arr[i][j]);
    for(i=0;i<3;i++)
        result+=arr[i][2-i];
    printf("%d",result);    
    return 0;
}

爬山

problemId:3442

Description

LeiQ最近参加了一个登山俱乐部,部长给他了一个n*m地图,地图上的每一个格子的值表示一个山的海拔高度,LeiQ现在在(x,y)表示在地图上的位置,他想要登上地图上最高的山,所以他想知道他爬上最高的山的山顶还需向上爬多少米。

例如:

 

<tbody>

	<tr>

		<td>

		<p>x\y</p>

		</td>

		<td>

		<p>1</p>

		</td>

		<td>

		<p>2</p>

		</td>

		<td>

		<p>3</p>

		</td>

	</tr>

	<tr>

		<td>

		<p>1</p>

		</td>

		<td>

		<p>100</p>

		</td>

		<td>

		<p>130</p>

		</td>

		<td>

		<p>150</p>

		</td>

	</tr>

	<tr>

		<td>

		<p>2</p>

		</td>

		<td>

		<p>200</p>

		</td>

		<td>

		<p>300</p>

		</td>

		<td>

		<p>100</p>

		</td>

	</tr>

	<tr>

		<td>

		<p>3</p>

		</td>

		<td>

		<p>100</p>

		</td>

		<td>

		<p>150</p>

		</td>

		<td>

		<p>50</p>

		</td>

	</tr>

</tbody>

 

 

 

 

 





现在LeiQ在(2,1),则他的位置海拔高度为200米,最高的为300米,所以还需爬100米

Input

多组输入

每组的第一行是两个整数n,m(1<=n,m<=100),表示地图的大小

接下来n行,每行m个整数,表示山的海拔高度(0<=Hij<=1000)

最后一行两个整数x,y表示LeiQ的位置

Ouput

输出他还需要向上爬多少米。

 

samples

<input>—> 3 3 100 130 150 200 300 100 100 150 50 2 1 <output>—> 100

Code

#include<stdio.h>

int main()
{
	int n,m,a,b;
    while(scanf("%d%d",&n,&m)!=EOF){
    int arr[100][100]={};
    int max=0,i,j;
    for(i=0;i<n;i++)
    	for(j=0;j<m;j++){
        	scanf("%d",&arr[i][j]);
            if(max<arr[i][j])
            	max=arr[i][j];
        }
    scanf("%d%d",&a,&b);
    printf("%d\n",max-arr[a-1][b-1]);   
    } 
    return 0;
}

C语言实验——矩阵转置

problemId:1164

Description

输入N*N的矩阵,输出它的转置矩阵。

Input

第一行为整数N(1≤N≤100)。

接着是一个N*N的矩阵。

Ouput

转置矩阵。

samples

<input>—> 2 1 2 1 2 <output>—> 1 1 2 2

Code

#include<stdio.h>

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

对称矩阵的判定

problemId:1522

Description

输入矩阵的行数,再依次输入矩阵的每行元素,判断该矩阵是否为对称矩阵,若矩阵对称输出“yes",不对称输出”no“。

### Input

输入有多组,每一组第一行输入一个正整数N(N<=20),表示矩阵的行数(若N=0,表示输入结束)。

下面依次输入N行数据。

Ouput

若矩阵对称输出“yes",不对称输出”no”。

### samples \--> 3 6 3 12 3 18 8 12 8 7 3 6 9 12 3 5 8 12 6 3 0 \--> yes no ### Code ``` #include int main() { int i,j,n,a[20][20]; while(true) { int f=1; scanf("%d",&n); if(n==0) { return 0; } else { for(i=0;i矩阵是非常美妙的东西,可以用来解方程,以及解决一些图论的问题等,应用很广泛。即使没有学过线性代数,大家也一定接触过矩阵,在编程中可以理解为二维的表。

矩阵有很多操作就像舞蹈一样,如行列的置换,矩阵的转置等。今天我们只看矩阵的旋转,希望得到当前矩阵顺时针旋转90度以后得到的矩阵。

Input

输入数据的第一行是一个正整数T,代表有T组测试样例。接下来T组数据,每组数据第一行是两个整数M,N (0  <  M , N  <  100),分别代表矩阵的行数和列数。然后是矩阵本身,共M行,每行N个数据用空格隔开。

Ouput

 对于每组输入的矩阵,第一行输出Case #k:(k为该组数据的序号,具体格式见样例),然后输出其旋转后的矩阵。

samples

<input>—> 2 4 4 1 2 3 4 5 6 7 8 6 6 6 6 8 8 8 8 2 3 1 2 3 4 5 6 <output>—> Case #1: 8 6 5 1 8 6 6 2 8 6 7 3 8 6 8 4 Case #2: 4 1 5 2 6 3

Code

#include<stdio.h>
int main()
{
    int t,n,m,i,j,q=1,a[1000][1000];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d %d",&m,&n);
        for(i=0;i<m;i++)
        {
            for(j=0;j<n;j++) scanf("%d",&a[i][j]);
        }
        printf("Case #%d:\n",q);
        q++;
        for(i=0;i<n;i++)
        {
            for(j=m-1;j>=0;j--) 
                printf("%d ",a[j][i]); 
            printf("\n");
        }
    }
    return 0;
}

杨辉三角

problemId:1216

Description

1

1  1

1  2   1

1  3   3   1

1  4   6   4  1

1  5 10 10  5  1

上面的图形熟悉吗?它就是我们中学时候学过的杨辉三角。

Input

输入数据包含多组测试数据。

每组测试数据的输入只有一个正整数n(1≤n≤30),表示将要输出的杨辉三角的层数。

输入以0结束。

Ouput

对应于每一个输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开,每一个杨辉三角后面加一个空行。

samples

<input>—> 2 3 0 <output>—> 1 1 1

1 1 1 1 2 1

Code

#include <stdio.h>
int main()
{
    int n;
    while (1)
    {
        scanf("%d", &n);
        if (n == 0)
            break;
        else if (n == 1)
            printf("%d\n\n", 1);
        else if (n == 2)
            printf("1\n1 1\n\n");
        else
        {
            int arr[n], arr_n[n];
            printf("1\n1 1\n");
            arr[1]=1;
            arr_n[0]=1;
            arr_n[1]=1;
            for (int i = 2; i < n; i++){
                arr[0]=arr[i]=1;
                for (int j = 1; j < i; j++)
                    arr[j]=arr_n[j-1]+arr_n[j];
                for (int j = 0; j <= i; j++){
                    arr_n[j]=arr[j];
                    if (j!=i)
                    printf("%d ",arr[j]);
                    else
                    printf("%d",arr[j]);
                    
                }
                printf("\n");
            }
            printf("\n");
        }
    }

    return 0;
}

鞍点计算

problemId:1198

Description

找出具有m行n列二维数组Array的“鞍点”,即该位置上的元素在该行上最大,在该列上最小,其中1<=m,n<=10。同一行和同一列没有相同的数。

Input

输入数据有多行,第一行有两个数m和n,下面有m行,每行有n个数。

Ouput

按下列格式输出鞍点:

Array[i][j]=x


其中,x代表鞍点,i和j为鞍点所在的数组行和列下标,我们规定数组下标从0开始。


一个二维数组并不一定存在鞍点,此时请输出None。

 

我们保证不会出现两个鞍点的情况,比如:

 

3 3

1 2 3

1 2 3

3 6 8

samples

<input>—> 3 3 1 2 3 4 5 6 7 8 9 <output>—> Array[0][2]=3

Code

#include <stdio.h>
int main()
{
    int m, n, flag;
    scanf("%d%d", &m, &n);
    int arr[m][n];
    int point[m], maxn, minn;
    for (int i = 0; i < m; i++)
        for (int j = 0; j < n; j++){
            scanf("%d", &arr[i][j]);
            point[i]=0;
        }
    for (int i = 0; i < m; i++)
    {
        maxn = arr[i][0];
        for (int j = 0; j < n; j++)
            if (maxn < arr[i][j])
            {
                maxn = arr[i][j];
                point[i]=j;
            }
    }
    for (int i = 0; i < m; i++)
    {
        int min=arr[i][point[i]];
        int flag=1;
        for (int j = 0; j < m; j++){
            if (arr[j][point[i]]<min){
                flag=0;
                break;
            }
        }
        if (flag)
        {
            printf("Array[%d][%d]=%d",i,point[i],arr[i][point[i]]);
            return 0;
        }
        
    }
    printf("None");

    return 0;
}