目录
图形相似度
描述
给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。
说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。
两幅图像的相似度定义为相同像素点数占总像素点数的百分比。
输入
第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格隔开。
1 <= m <= 100, 1 <= n <= 100。
之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。
之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色。相邻两个数之间用单个空格隔开。
输出
一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。
#include<iostream>
#include<iomanip>
using namespace std;
int a[110][110];
int b[110][110];
int n,m;
int main()
{
cin>>n>>m;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
}
}
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>b[i][j];
}
}
int cnt = 0;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
if(a[i][j] == b[i][j])
{
cnt++;
}
}
}
cout<<fixed<<setprecision(2)<<1.0*cnt/(n*m)*100;
return 0;
}
矩阵边缘之和
描述
输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是第一行和最后一行的元素以及第一列和最后一列的元素。
输入
第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格分开。
接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。
输出
输出对应矩阵的边缘元素和
#include<iostream>
#include<iomanip>
using namespace std;
int a[110][110];
int b[110][110];
int n,m;
int main()
{
cin>>n>>m;
int sum = 0;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
if(i == 0 || i == n-1 || j == 0 || j == m-1)
{
sum = sum + a[i][j];
}
}
}
return 0;
}
最好的草
描述
奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。它想计算一下牧场中的草丛数量。
在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个“#”。给定牧场地图,计算有多少个草丛。
例如,考虑如下5行6列的牧场地图
.#....
..#...
..#..#
...##.
.#....
这个牧场有5个草丛:一个在第一行,一个在第二列横跨了二、三行,一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。
输入
第一行包含两个整数R和C,中间用单个空格隔开。
接下来R行,每行C个字符,描述牧场地图。字符只有“#”或“.”两种。(1 <= R, C <= 100 )
输出
输出一个整数,表示草丛数。
#include<iostream>
#include<iomanip>
using namespace std;
char a[110][110];
int n,m;
int main()
{
cin>>n>>m;
for(int i = 1;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
}
}
int cnt = 0;
for(int i = 1;i<n;i++)
{
for(int j = 1;j<m;j++)
{
if(a[i][j] == '#')
{
cnt++;
a[i-1][j] = '.';
a[i+1][j] = '.';
a[i][j-1] = '.';
a[i][j+1] = '.';
}
}
}
cout<<cnt;
return 0;
}
图像模糊处理
描述
给定n行m列的图像各像素点的灰度值,要求用如下方法对其进行模糊化处理:
1. 四周最外侧的像素点灰度值不变;
2. 中间各像素点新灰度值为该像素点及其上下左右相邻四个像素点原灰度值的平均(舍入到最接近的整数)。
输入
第一行包含两个整数n和m,表示图像包含像素点的行数和列数。1 <= n <= 100,1 <= m <= 100。接下来n行,每行m个整数,表示图像的每个像素点灰度。相邻两个整数之间用单个空格隔开,每个元素均在0~255之间。
输出
n行,每行m个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。
#include<iostream>
#include<iomanip>
using namespace std;
int a[110][110] = {0};
int b[110][110] = {0};
int n,m;
int main()
{
cin>>n>>m;
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cin>>a[i][j];
if(i == 0 || j == 0 || i == n-1 || j == m-1)
{
b[i][j] = a[i][j];
}
}
}
for(int i = 1;i<n-1;i++)
{
for(int j = 1;j<m-1;j++)
{
b[i][j] = (a[i][j] + a[i+1][j] + a[i-1][j] + a[i][j+1] + a[i][j-1])/5.0;
}
}
for(int i = 0;i<n;i++)
{
for(int j = 0;j<m;j++)
{
cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
扫雷
描述
扫雷游戏是一款十分经典的单机小游戏。它的精髓在于,通过已翻开格子所提示的周围格地雷数,来判断未翻开格子里是否是地雷。
现在给出n行m列的雷区中的地雷分布,要求计算出每个非地雷格的周围格地雷数。
注:每个格子周围格有八个:上、下、左、右、左上、右上、左下、右下。
输入
第一行包含两个整数n和m,分别表示雷区的行数和列数。1 <= n <= 100, 1 <= m <= 100。
接下来n行,每行m个字符,‘*’表示相应格子中是地雷,‘?’表示相应格子中无地雷。字符之间无任何分隔符。
输出
n行,每行m个字符,描述整个雷区。若相应格中是地雷,则用‘*’表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
#include<iostream>
#include<iomanip>
using namespace std;
char a[110][110];
char b[110][110] = {0};
int n,m;
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] =='*')
{
b[i+1][j]++;
b[i][j+1]++;
b[i-1][j]++;
b[i][j-1]++;
b[i+1][j+1]++;
b[i-1][j+1]++;
b[i-1][j-1]++;
b[i+1][j-1]++;
}
}
}
for(int i = 1;i<n;i++)
{
for(int j = 1;j<m;j++)
{
if(a[i][j] == '*') cout<<"*"<<" ";
else cout<<b[i][j]<<" ";
}
cout<<endl;
}
return 0;
}