计算矩阵边缘元素之和 查看测评数据信息
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入格式
第一行分别为矩阵的行数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
输出:
#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个点)
输入格式
第一行,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;
}