2 二维数组入门

第1题     二维数组的输出

读入一个n行m列的二维数组(方阵、矩阵),按下述要求输出。所有数据都是正整数(100以内)。(1<=n,m<=10)

输入格式

第一行空格隔开的四个数字:n,m,p,q;(保证1<p<n,1<q<m且p,q不同) 
接下来是一个n行m列的矩阵。

输出格式

第一行输出矩阵的第一行的数据。
第二行输出矩阵的最后一行的数据。
第三行输出矩阵的第p行的数据。
第四行输出矩阵的第q列的数据。

输入/输出例子1

输入:

5 6 3 4

1 2 3 4 5 3

3 5 9 2 4 1

4 3 6 8 2 9

9 7 5 9 7 3

22 9 7 5 3 12

输出:

1 2 3 4 5 3

22 9 7 5 3 12

4 3 6 8 2 9

4 2 8 9 5

#include<bits/stdc++.h>
using namespace std;
long long n,m,p,q;
long long a[105][105];
int main(){
	cin>>n>>m;
	cin>>p>>q;
	for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++)
	cin>>a[i][j];
	for (int i=1;i<=m;i++)
	cout<<a[1][i]<<" ";
	cout<<endl;
	for (int i=1;i<=m;i++)
	cout<<a[n][i]<<" ";
	cout<<endl;
	for (int i=1;i<=m;i++)
	cout<<a[p][i]<<" ";
	cout<<endl;
	for (int i=1;i<=n;i++)
	cout<<a[i][q]<<" ";
	cout<<endl;
	return 0;
}

第2题     二维数组的输出2

读入一个n行n列的二维数组(方阵、矩阵),按下述要求输出。所有数据都是正整数(100以内)。(1<=n,m<=10)

输入格式

第一行三个数字:n,p,q; (p,q不同) 
接下来是一个n行n列的矩阵。

输出格式

第一行输出矩阵的第一列的数据。
第二行输出矩阵的最后一列的数据。
第三行输出矩阵的左斜边的数据(从上到下)。
第四行输出矩阵的右斜边的数据(从上到下)。
第五行输出矩阵的左斜边的数据(从下到上)。
第六行输出矩阵的p行q列的数据。

输入/输出例子1

输入:

5 5 3

1 2 3 4 5

3 5 9 2 4

4 3 6 8 2

9 7 5 9 7

0 9 7 5 3

输出:

1 3 4 9 0

5 4 2 7 3

1 5 6 9 3

5 2 6 7 0

3 9 6 5 1

7

#include <bits/stdc++.h>
using namespace std;
long long n,m,q,p;
long long a[105][105];
int main(){
    cin>>n>>p>>q;
    for(int i=1;i<=n;i++)
    {
    	for(int j=1;j<=n;j++)
    	{
    		cin>>a[i][j];
		 } 
	}
	for(int i=1;i<=n;i++)
	{
		cout<<a[i][1]<<" ";
	}
	cout<<endl;
	for(int i=1;i<=n;i++)
	{
		cout<<a[i][n]<<" ";
	}
	cout<<endl;
	for(int i=1;i<=n;i++)
	{
		cout<<a[i][i]<<" ";
	}
	cout<<endl;
	int k=1;
	for(int i=n;i>=1;i--)
	{
		cout<<a[k][i]<<" ";
		k++;
	}
	cout<<endl;
	for(int i=n;i>=1;i--)
	{
		cout<<a[i][i]<<" ";
	}
	cout<<endl;
	cout<<a[p][q];


	return 0;
}

第3题     改变二维数组

输入一个n行m列的二维数组,把它的奇数和偶数行互换后输出。
n,m为不超过20的正整数。数组内的数据为不大于200的正整数。

输入格式

共n+1行,第一行包括两个数字n和m。
第二行到第n+1行是这个数组里的数据。数据间用空格隔开。

输出格式

输出n行的改变后的数组。

输入/输出例子1

输入:

3 2

1 2

5 6

7 8

输出:

5 6

1 2

7 8

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[105][105];
int main(){
    cin>>n>>m;
    for (int i=1;i<=n;i++)
	for (int j=1;j<=m;j++)
	cin>>a[i][j];
    for (int i=1;i<n;i++) {
        if (i%2==1) {
            for (int j=1;j<=m;j++) {
                swap(a[i][j],a[i+1][j]);
            }
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

第4题     优质格子

操场被划分成n行m列的格子。刚刚下了一场暴雨,由于操场凹凸不平,有些格子是有积水的,有些格子是没有积水的。用1来表示没有积水,用0来表示有积水。如果某个格子X没有积水,而且与它相邻的上下左右4个格子都没有积水,那么格子X就称为“优质格子”。给出每个格子的状态,问总共有多少个格子是“优质格子”。

输入格式

第一行,两个整数n和m。1<=n,m<=200。

接下来是n行,每行有m个整数,每个整数要么是0要么是1。

输出格式

一个整数。

输入/输出例子1

输入:

4 4

1 0 1 1

1 0 1 1

0 1 1 1

0 0 1 1

 

输出:

5

#include<bits/stdc++.h>
using namespace std;
long long n,m,a[205][205],s=0;
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>a[i][j];
            if(a[i][j]==1){
			    a[i][j]=0;
            }
            else{
                a[i][j]=1;
            }
        }
    }
    for(int i=1;i<=n;i++){
        int bj=0;
        for(int j=1;j<=m;j++){
            if(a[i][j]==0){
                bj=1;
                if(a[i-1][j]==1){
                    bj=0;
                }
                if(a[i+1][j]==1){
                    bj=0;
                }
                if(a[i][j+1]==1){
                    bj=0;
                }
                if(a[i][j-1]==1){
                    bj=0;
                }
            }
            if(bj==1){
                s++;
            }
        }
    }
    cout<<s;
    return 0;
}

第5题     01矩阵

输入2个整数N和M,输出N行M列的的01数字矩阵。第1行第1个数是’1’,后面的数都和其左边或上面数相反(0和1称为相反)。例如:N=4,M=5时:
10101
01010
10101
01010

输入格式

第一行2个正整数:N和M,范围在[1,20]。

输出格式

N行M列的0/1相间的数字矩阵。

输入/输出例子1

输入:

3 3

输出:

101
010
101

#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long s[29][29]; 
int main(){    
    cin>>n>>m;  
    for (int i=1;i<=n;i++) {
	    if (s[i-1][1]==0) s[i][1] = 1; 
        else s[i][1] = 0;
    	for (int j=2;j<=m;j++) {
    		if (s[i][j-1]==0) s[i][j] = 1;
    		else s[i][j] = 0;
    	}
    }
    for (int i=1;i<=n;i++) {
    	for (int j=1;j<=m;j++) 
		cout<<s[i][j];
    	cout<<endl;
    }
    return 0;
}

第6题     成绩

已知班上所有同学的成绩,但太多数字了,老师看着这么多的成绩发呆了。会编程的你自告奋勇的担起了这个任务。你需要实现计算每位同学总分的功能,并找到全班总分最高和最低同学的最高分和最低分的科目成绩。

输入格式

第一行:两个数,学生数m及科目数n(1<=m<=200,1<=n<=10);

以下m行,每行n个数,分别为学生各科成绩(最高分为100,没有负分)。

输出格式

输出m+2行,前m行每行1个数,表示学生的总成绩。

第m+1行是总分最高同学的最高分和最低分科目的成绩。

第m+2行是总分最低同学的最高分和最低分科目的成绩。

(保证只有一个最高分和最低分,且只有一个科目分数最高和最低)

输入/输出例子1

输入:

3 5

83 81 79 85 91

84 86 87 88 86

87 82 90 80 84

输出:

419

431

423

88 84

91 79

#include <bits/stdc++.h>
using namespace std;
const int N=1e5;
long long m,n,a[205][15];
long long minn=N,maxx,x,y,max_x,minx=N,maxy,miny=N;
long long sum[205],ans;
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			scanf("%d",&a[i][j]);
			sum[i] += a[i][j];
		}
	if(maxx<sum[i]) maxx = sum[i],x=i;
	if(minn>sum[i]) minn = sum[i],y=i;
	}
	for(int i=1;i<=n;i++) cout<<sum[i]<<endl;
   
	for(int i=1;i<=m;i++)
	{
		max_x=max(max_x,a[x][i]);
		minx=min(minx,a[x][i]);
	}
	cout<<max_x<<" "<<minx<<endl;
	for(int i=1;i<=m;i++)
	{
		maxy = max(maxy,a[y][i]);
		miny = min(miny,a[y][i]);
	}
	cout<<maxy<<" "<<miny<<endl;
	return 0;
}

第7题     最大的子方阵

输入一个m*n的矩阵(4<=m,n<=50),它是含有大小p*q的子矩阵,(2<=p,q<=m,n),请找出m*n矩阵和最大的p*q子矩阵。

如下样例所示,对于以下为4*5的矩阵:

1 2 3 4 5

5 100 3 2 1

6 7 8 9 10

10 9 8 7 6

其最大的2*3的子矩阵:

5 100 3

6 7 8

 

输入格式

第一行,4个整数m,n,p,q

接下来共m行,每行有n个数;

输出格式

共1行,空格隔开的三个数。分别为最大的p*q子矩阵的和,以及其子矩阵的最左上角元素的横坐标、纵坐标。

输入/输出例子1

输入:

4 5 2 3

1 2 3 4 5

5 100 3 2 1

6 7 8 9 10

10 9 8 7 6

 

输出:

129 2 1

#include<bits/stdc++.h>
using namespace std;
long long n,m,p,q;
long long ans,bns,maxx;
long long a[55][55];
int main(){
    cin>>n>>m>>p>>q;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            cin>>a[i][j];
        }
    }
    for (int i=1;i<=n-p+1;i++) {
        for (int j=1;j<=m-q+1;j++) {
            long long s=0;
            for (int x=i;x<=i+p-1;x++) {
                for (int y=j;y<=j+q-1;y++) {
                    s += a[x][y];
                }
            }
            if (s>maxx) maxx = s,ans = i,bns = j;
        }
    }
    cout<<maxx<<" "<<ans<<" "<<bns;
    return 0;
}

 第8题     马鞍数

马鞍数是指一个n*m矩阵中,在行上最小而在列上最大的数。如矩阵n*m,其中n=4,m=5

5 6 7 8 9

4 5 6 7 8

3 4 5 2 1

2 3 4 9 0

 

则1行1列上的数就是马鞍数。答案有且只有一个。

输入:

第一行,两个数n和m(1<=n,m<=100)

以下n行,每行m个数

 

输出:

输出马鞍数所在的位置

 

样例输入:

4 5

5 6 7 8 9

4 5 6 7 8

3 4 5 2 1

2 3 4 9 0

 

样例输出:

1 1

#include<bits/stdc++.h>
using namespace std;
int n,m,a[205][205],x,y;
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++)
	{
		int f=0,f2=0,maxx=0,minn=a[i][1],x=1;
		for(int j=1;j<=m;j++)
			if(a[i][j]<minn) minn=a[i][j],x=j;
		for(int j=1;j<=n;j++)
			maxx=max(maxx,a[j][x]);
		if(a[i][x]==maxx)
		{
			cout<<i<<" "<<x;
			return 0;
		}
	}
	
	return 0;
}
  • 26
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值