二维数组的练习(一)

计算矩阵边缘元素之和 查看测评数据信息

输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。

输入格式

第一行分别为矩阵的行数m和列数n(m<100,n<100),两者之间以一个空格分开。

接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。

输出格式

输出对应矩阵的边缘元素和。

输入/输出例子1

输入:

3 3

3 4 1

3 7 1

2 0 1

输出:

15

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

拐角VI 查看测评数据信息

输入整数N,输出相应方阵。

输入格式

一个整数N。( 0 < n < 10 )

输出格式

一个方阵,每个数字的场宽为3。

输入/输出例子1

输入:

5

输出:

无标题.png

#include<bits/stdc++.h>
using namespace std;
int n,a[20][20];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		a[n+1-i][i]=i; 
		for(int j=i+1;j<=n;j++){
			a[n+1-i][j]=a[j-i][i]=i;
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<setw(3)<<a[i][j];
		}
		cout<<endl;
	}
	return 0;
} 

地毯 查看测评数据信息

在 n×n 的格子上有 m个地毯。

给出这些地毯的信息,问每个格子被多少个地毯覆盖。

输入格式

第一行,两个正整数 n,m。意义如题所述。

接下来 m行,每行两个坐标 (x1,y1) 和 (x2,y2),代表一块地毯,左上角是 (x1,y1),右下角是(x2,y2)。

输出格式

输出 n行,每行 n个正整数。

第 i 行第 j列的正整数表示 (i,j)这个格子被多少个地毯覆盖。

输入/输出例子1

输入:

5 3

2 2 3 3

3 3 5 5

1 2 1 4

输出:

0 1 1 1 0

0 1 1 0 0

0 1 2 1 1

0 0 1 1 1

0 0 1 1 1

样例解释

数据范围

对于 20% 的数据,有 n≤50,m≤100。

对于 100% 的数据,有 n,m≤1000。 

x2-x1<=100,y2-y1<=100

#include<bits/stdc++.h>
using namespace std;
int a[1009][1009];
int main(){
    int n,m,x1,y1,x2,y2;
    cin>>n>>m;
    for(int i=1;i<=m;i++){
        cin>>x1>>y1>>x2>>y2;
        for(int k=x1;k<=x2;k++)
            for(int j=y1;j<=y2;j++)
                a[k][j]++;
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
           cout<<a[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}

风景点 查看测评数据信息

给出 N 行 M 列的二维格子, 每个格子要么是‘#’ ,要么是‘.’ 。 一个格子是“风景点” ,

如果它同时满足如下两个条件:

1、 该格子是‘.’

2、 该格子的上、 下、 左、 右, 4 个方向全部都是‘.’ 。

你的任务是总共有多少个“风景点” 。

(4个方向,不是指相邻的4个点)

pimg2143_1.jpg

输入格式

第一行,N 和 M。 1<=N,M<=50。

接下来是 N 行 M 列的二维格子。

输出格式

一个整数。

输入/输出例子1

输入:

6 9

..#......

.........

.###..#..

.#.##..#.

...#..#..

.........

输出:

6

#include<bits/stdc++.h>
using namespace std;
int n,m,c=0,f;
char a[55][55];
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++){
        for(int j=1;j<=m;j++){
            f=0;
            if(a[i][j]=='.'){
                for(int k=1;k<=m;k++){
                    if(a[i][k]!='.'){
                        f=1;
                        break;
                    }
                }
                for(int h=1;h<=n;h++){
                    if(a[h][j]!='.'){
                        f=1;
                        break;
                    }
                }
                if(f==0)c++;
            }
        }                   
    }
    cout<<c;
    return 0;
} 

监考老师2 查看测评数据信息

在一个大试场里,有n行m列的考生,小王和众多同学正在考试,这时,有一部分考生作弊,当然,监考老师能发现他们。但是只有一个监考老师,他由于高度近视,只能发现与他同行同列的作弊者,而且由于监考老师年老体弱,在考试过程中无法移动。现在已知n*m个考生中谁在作弊,请帮监考老师找一个位置,可以发现最多的作弊者(监考老师可以和某个考生在同一位置)。如果监考老师的位置上的考生在作弊,那么监考老师先前后看,发现他作弊,再左右看,又发现他作弊,算做发现2个考生作弊。

输入格式

第一行两个数n,m ,表示试场是n*m的,接下来是n*m的矩阵,1表示作弊,0表示不作弊。

输出格式

共一行,一个数,表示最多可以发现多少作弊者。

输入/输出例子1

输入:

5 5 

0 0 1 0 0 

0 0 1 0 0 

1 1 1 1 1 

0 0 1 0 0 

0 0 1 0 0 

输出:

10

样例解释

监考老师在最中间,那个位置上的作弊者算作2次

【数据范围】 

对于50 %的数据,n,m大于0小于等于10,对于100 %的数据,n,m大于0小于等于2000。 

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

相同像数 查看测评数据信息

给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相同像数。

说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。

输入格式

第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格隔开。1 <= m <= 100, 1 <= n <= 100。

之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。

之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。

输出格式

一个整数,表示像素点相同的个数。

输入/输出例子1

输入:

3 3 

1 0 1 

0 0 1 

1 1 0 

1 1 0 

0 0 1 

0 0 1 

输出:

4

样例解释

数据范围限制

1 <=m<=100,1<=n<=100

#include<bits/stdc++.h>
using namespace std;
int a[999][999],b[999][999];
int main(){
	int m,n,x=0;
	cin>>m>>n;
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			cin>>a[i][j];
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++){
			cin>>b[i][j];
			if(a[i][j]==b[i][j])x++;
		}
	printf("%d",x);
	return 0;
 } 

回形方阵 查看测评数据信息

编程打印如下规律的n*n方阵。输入n,按规律输出方阵。

方阵规律如下图:最外圈为1,内圈每圈增加1。

1  1  1  1  1

1  2  2  2  1

1  2  3  2  1

1  2  2  2  1

1  1  1  1  1

输入格式

正整数n(<=100)。

输出格式

所需的方阵。

输入/输出例子1

输入:

5

输出:

1 1 1 1 1

1 2 2 2 1

1 2 3 2 1

1 2 2 2 1

1 1 1 1 1

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n;
    cin>>n;
    int a[n][n],s=1,b=0,c=n-1,d=0,e=n-1;
    while(b<=c&&d<=e){
        for(int i=d;i<=e;i++)a[b][i]=s;
        b++;
        for(int i=b;i<=c;i++)a[i][e]=s;
        e--;
        for(int i=e;i>=d;i--)a[c][i]=s;
        c--;
        for(int i=c;i>=b;i--)a[i][d]=s;
        d++,s++;
    }
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            cout<<a[i][j]<<" ";
        }
        cout<<endl;
    }
    return 0;
}

扫雷游戏 查看测评数据信息

扫雷游戏是一款十分经典的单机小游戏。在 n 行 m 列的雷区中有一些格子含有地雷(称之为地雷格),其他格子不含地雷(称之为非地雷格)。玩家翻开一个非地雷格时,该格将会出现一个数字——提示周围格子中有多少个是地雷格。游戏的目标是在不翻出任何地雷格的条件下,找出所有的非地雷格。现在给出 n行 m列的雷区中的地雷分布,要求计算出每个非地雷格周围的地雷格数。注:一个格子的周围格子包括其上、下、左、右、左上、右上、左下、右下八个方向上与之直接相邻的格子。

输入格式

输入文件第一行是用一个空格隔开的两个整数 n和 m,分别表示雷区的行数和列数。

接下来 n 行,每行 m 个字符,描述了雷区中的地雷分布情况。字符’ *’表示相应格子是地雷格, 字符’ ?’表示相应格子是非地雷格。相邻字符之间无分隔符。

输出格式

输出文件包含 n 行,每行 m 个字符,描述整个雷区。用’ *’表示地雷格,用周围的地雷个数表示非地雷格。相邻字符之间无分隔符。

输入/输出例子1

输入:

3 3

*??

???

?*?

输出:

*10

221

1*1

输入/输出例子2

输入:

2 3

?*?

*??

输出:

2*1

*21

样例解释

【数据说明】

对于 100%的数据, 1≤n≤100, 1≤m≤100。

#include<bits/stdc++.h>
using namespace std;
char c[105][105];
int dfs(int x, int y){
	int ans=0;
	if(c[x-1][y]=='*')++ans;
	if(c[x+1][y]=='*')++ans;
	if(c[x][y-1]=='*')++ans;
	if(c[x][y+1]=='*')++ans;
	if(c[x-1][y-1]=='*')++ans;
	if(c[x-1][y+1]=='*')++ans;
	if(c[x+1][y-1]=='*')++ans;
	if(c[x+1][y+1]=='*')++ans;
	return ans;
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>c[i][j];
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			if(c[i][j]=='*')
				cout<<'*';
			else
				cout<<dfs(i,j);
		}
		cout<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值