C语言程序设计基础OJ练习题(实验七二维数组)

一、C语言实验——求一个3*3矩阵对角线元素之和

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

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

Input

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

Output

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

Sample Input

1 2 3
3 4 5
6 0 1

Sample Output

13

#include<stdio.h>
int main()
{
    int s[3][3],sum;
    sum = 0;
    for(int i=0; i<3; i++)
    {
        for(int j = 0; j<3; j++)
        {
            scanf("%d",&s[i][j]);
            if(j==2-i)
                sum = sum + s[i][j];
        }
    }
    printf("%d\n",sum);
    return 0;
}

 

二、爬山

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

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

例如:
 

x\y

1

2

3

1

100

130

150

2

200

300

100

3

100

150

50

 

 

 

 
 





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

Input

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

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

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

Output

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

 

Sample Input

3 3
100 130 150
200 300 100
100 150 50
2 1

Sample Output

100

#include<stdio.h>
int main()
{
    int n,m,x,y,s[101][101],max,ans;
    while(scanf("%d %d",&n,&m)!=EOF)
    {
        max = 0;
        for(int i=0; i<n; i++)
        {
            for(int j = 0; j<m; j++)
            {
                scanf("%d",&s[i][j]);
                if(s[i][j]>max)
                    max = s[i][j];
            }
        }
        scanf("%d %d",&x,&y);
        ans = max-s[x-1][y-1];
        printf("%d\n",ans);
    }
    return 0;
}

 

三、C语言实验——矩阵转置

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

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

Input

第一行为整数N(1≤N≤100)。
接着是一个N*N的矩阵。

Output

转置矩阵。

Sample Input

2
1 2
1 2

Sample Output

1 1
2 2

#include<stdio.h>
int main()
{
    int n,s[101][101];
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        for(int j = 0; j<n; j++)
        {
            scanf("%d",&s[j][i]);
        }
    }
    for(int i=0; i<n; i++)
    {
        for(int j = 0; j<n-1; j++)
        {
            printf("%d ",s[i][j]);
        }
        printf("%d\n",s[i][n-1]);
    }
    return 0;
}

 

四、对称矩阵的判定

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

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

Input

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

Output

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

Sample Input

3
6 3 12
3 18 8
12 8 7
3
6 9 12
3 5 8
12 6 3
0

Sample Output

yes
no

#include<stdio.h>
int main()
{
    int n,s[101][101],sum;
    while(scanf("%d",&n)!=EOF&&n!=0)
    {
        sum = 0;
        for(int i=0; i<n; i++)
        {
            for(int j = 0; j<n; j++)
            {
                scanf("%d",&s[i][j]);
            }
        }
        for(int i=0; i<n; i++)
        {
            for(int j = i; j<n; j++)
            {
                if(s[i][j]==s[j][i])
                    sum++;
            }
        }
        if(sum==(n+1)*n/2)
            printf("yes\n");
        else
            printf("no\n");
    }
    return 0;
}

 

五、杨辉三角

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem 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结束。

Output

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

Sample Input

2
3
0

Sample Output

1
1 1

1
1 1
1 2 1

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

六、鞍点计算

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

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

Input

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

Output

按下列格式输出鞍点:

Array[i][j]=x

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

一个二维数组并不一定存在鞍点,此时请输出None。
 
我们保证不会出现两个鞍点的情况,比如:
 
3 3
1 2 3
1 2 3
3 6 8

Sample Input

3 3
1 2 3
4 5 6
7 8 9

Sample Output

Array[0][2]=3

#include<stdio.h>
int main()
{
    int m,n,s[101][101],f;
    f = 0;
    scanf("%d%d",&m,&n);
    for(int i=0; i<m; i++)
    {
        for(int j = 0; j<n; j++)
        {
            scanf("%d",&s[i][j]);
        }
    }
    for(int i=0; i<m; i++)
    {
        int x,y,flag,max;
        flag = 0;
        max = s[i][0];
        for(int j = 1;j<n;j++)
        {
            if(s[i][j]>max)
            {
                max = s[i][j];
                x = i;
                y = j;
            }
        }
        for(int j = 0;j<m;j++)
        {
            if(s[j][y]>max)
            {
                flag++;
            }
        }
        if(flag==m-1)
        {
            f = 1;
            printf("Array[%d][%d]=%d\n",x,y,s[x][y]);
            break;
        }
    }
    if(f==0)
    {
        printf("None\n");
    }
    return 0;
}

 

七、矩阵的舞蹈

Time Limit: 1000 ms Memory Limit: 32768 KiB

Submit Statistic

Problem Description

矩阵是非常美妙的东西,可以用来解方程,以及解决一些图论的问题等,应用很广泛。即使没有学过线性代数,大家也一定接触过矩阵,在编程中可以理解为二维的表。

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

Input

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

Output

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

Sample 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

Sample 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

#include<stdio.h>
int main()
{
    int T,a[101][101],i,j,k;
    scanf("%d",&T);
    for(k = 1;k<=T;k++)
    {
       int m,n;
       scanf("%d%d",&m,&n);
       for(i=1;i<=m;i++)
       {
           for(j=1;j<=n;j++)
           {
               scanf("%d",&a[i][j]);
           }
       }
       printf("Case #%d:\n",k);
       for(i=n;i>=1;i--)
       {
           for(j=1;j<=m;j++)
           {
               if(j!=m)
                printf("%d ",a[m-j+1][n-i+1]);
               else
                printf("%d\n",a[m-j+1][n-i+1]);
           }
       }
    }
    return 0;
}

 

八、排座号

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

马上就要考试啦!老师给 bLue 安排了布置考场的任务:把一个 n 行 m 列的考场按 S 型排好座号。

排座号的规则是:从第 1 行 第 1 列开始,按照初始行号递增的方向 S 型排号,如图所示:

01   06 → 07   12

↓    ↑    ↓    ↑ 

02   05   08   11

↓    ↑    ↓    ↑ 

03 → 04   09 → 10

 

现在 bLue 正为如何排座号犯难,你能帮助他吗?

Input

输入数据有多组(数据组数不超过 65),到 EOF 结束。

每组数据输入一行,包含 2 个用空格隔开的整数 n, m (2 <= n, m < 10),分别代表考场里座位的行数和列数。

Output

对于每组数据,输出 n 行,每行 m 个用空格隔开的整数,表示按 S 型排好的座号(不足 2 位数的座号前面加 0 补足 2 位)。

Sample Input

3 4

Sample Output

01 06 07 12
02 05 08 11
03 04 09 10

Hint

座号可以使用 printf("%02d") 来输出。

Source

【2016级《程序设计基础(B)I》期末上机考试-第二场】bLue

#include<stdio.h>
int main()
{
    int n,m,a[20][20],flag;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        flag = 1;
        for(int i = 0; i < m; i++)
        {
            if(i%2==0)
            {
                for(int j = 0; j <n; j++)
                {
                    a[j][i]=flag++;
                }
            }
            else
            {
                for(int j = n-1; j >=0; j--)
                {
                    a[j][i]=flag++;
                }
            }
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j <m-1; j++)
            {
                printf("%02d ",a[i][j]);
            }
            printf("%02d\n",a[i][m-1]);
        }
    }
    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值