图形相似度
题目描述: 给出两幅相同大小的黑白图像(用0-1矩阵)表示,求它们的相似度。 说明:若两幅图像在相同位置上的像素点颜色相同,则称它们在该位置具有相同的像素点。 两幅图像的相似度定义为相同像素点数占总像素点数的百分比。 输入 第一行包含两个整数m和n,表示图像的行数和列数,中间用单个空格隔开。 1 <= m <= 100, 1 <= n <= 100。 之后m行,每行n个整数0或1,表示第一幅黑白图像上各像素点的颜色。相邻两个数之 间用单个空格隔开。 之后m行,每行n个整数0或1,表示第二幅黑白图像上各像素点的颜色。相邻两个数之 间用单个空格隔开。 输出 一个实数,表示相似度(以百分比的形式给出),精确到小数点后两位。
输入复制
2 2
1 1
0 0
1 0
0 0
输出复制
75.00
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[110][110];
int b[110][110];
int n,m;
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*(100*cnt)/(n*m);
return 0;
}
矩阵边缘之和 题目描述: 输入一个整数矩阵,计算位于矩阵边缘的元素之和。所谓矩阵边缘的元素,就是 第一行和最后一行的元素以及第一列和最后一列的元素。 输入 第一行分别为矩阵的行数m和列数n(m < 100,n < 100),两者之间以一个空格 分开。 接下来输入的m行数据中,每行包含n个整数,整数之间以一个空格分开。 输出 输出对应矩阵的边缘元素和
输入复制
3 3
1 2 3
4 5 6
7 8 9
输出复制
40
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[110][110]={0};
int n,m;
cin>>n>>m;
int k=1;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
a[i][j]=k;
k++;
}
}
for(int i=n-1;i>=0;i--)
{
for(int j=0;j<m;j++)
{
cout<<setw(3)/*不管这个数多大,都按照3位后对齐*/<<a[i][j];
}
cout<<endl;
}
return 0;
}
最好的草
描述 奶牛Bessie计划好好享受柔软的春季新草。新草分布在R行C列的牧场里。 它想计算一下牧场中的草丛数量。 在牧场地图中,每个草丛要么是单个“#”,要么是有公共边的相邻两个“#”。 给定牧场地图,计算有多少个草丛。 例如,考虑如下5行6列的牧场地图
. # . . .
. . . # .
. . . . #
. . # . .
. # # . .
# . . . .
这个牧场有5个草丛:一个在第一行,一个在第二列横跨了二、三行, 一个在第三行,一个在第四行横跨了四、五列,最后一个在第五行。 输入 第一行包含两个整数R和C,中间用单个空格隔开。 接下来R行,每行C个字符,描述牧场地图。字符只有“#”或“.”两种。(1 <= R, C <= 100 ) 输出 输出一个整数,表示草丛数。
输入复制
3 3
# # .
. . #
# # .
输出复制
3
#include<iostream>
using namespace std;
int main()
{
char a[110][110];//char是因为这次输入的是字符
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;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个整数,为模糊处理后的图像。相邻两个整数之间用单个空格隔开。(注意:因为每一个数在模糊化的时候,都要提取周围数的值,所以我们需要两个二维数组,其中一个专门用来保存更改后的数据)
输入复制
4 5
100 0 100 0 50
50 100 200 0 0
50 50 100 100 200
100 100 50 50 100
输出复制
100 0 100 0 50
50 80 100 60 0
50 80 100 90 200
100 100 50 50 100
#include<iostream>
using namespace std;
int main()
{
int a[110][110];
int b[110][110];
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(i!=0&&i!=n-1&&j!=0&&j!=m-1)
{
int sum=0;
sum=sum+a[i-1][j];
sum=sum+a[i+1][j];
sum=sum+a[i][j-1];
sum=sum+a[i][j+1];
sum=sum+a[i][j];
b[i][j]=sum/5;
}
}
}
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个字符,描述整个雷区。若相应格中是地雷,则用‘*’ 表示,否则用相应的周围格地雷数表示。字符之间无任何分隔符。
输入复制
* ??
???
?* ?
输出复制
*10
221
1*1
#include<iostream>
using namespace std;
int main()
{
char a[110][110];
int n,m;
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++)
{
if(a[i][j]!='*')
{
int cnt=0;
if(a[i-1][j]=='*')//判断上面是不是雷
{
cnt++;
}
if(a[i+1][j]=='*')//判断下面是不是雷
{
cnt++;
}
if(a[i][j-1]=='*')//判断左面是不是雷
{
cnt++;
}
if(a[i][j+1]=='*')//判断右面是不是雷
{
cnt++;
}
if(a[i-1][j-1]=='*')//判断左上面是不是雷
{
cnt++;
}
if(a[i+1][j+1]=='*')//判断右下面是不是雷
{
cnt++;
}
if(a[i-1][j+1]=='*')//判断右上面是不是雷
{
cnt++;
}
if(a[i+1][j-1]=='*')//判断左下面是不是雷
{
cnt++;
}
a[i][j]=cnt+48;
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
输出杨辉三角的前 N 行
题目描述: 输出杨辉三角的前 N 行(N<10) 。 输入 输入只有一行,包括 1个整数 N 。(N<10) 输出 输出只有 N 行 .
杨辉三角:
输入复制
5
输出复制
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a[110][110]={0};
int n;
cin>>n;
for(int i=5;i<n+5;i++)
{
for(int j=5;j<n+5;j++)
{
if(j==5||j==i)
{
a[i][j]=1;
}
}
}
for(int i=7;i<n+5;i++)
{
for(int j=5;j<n+4;j++)
{
a[i][j]=a[i-1][j]+a[i-1][j-1];
}
}
for(int i=5;i<n+5;i++)
{
for(int j=5;j<n+5;j++)
{
if(j<=i)
{
cout<<a[i][j]<<" ";
}
}
cout<<endl;
}
return 0;
}
孤独的偶数
题目描述: 在一个 n 行 m 列的矩阵王国中,生活着一些整数,其中一些是偶数,一些不是偶数。如果一个偶数的 上下左右、左上、右上、左下、右下相邻的数中都没有素数,我们就认为这是一个孤独的偶数。 输入 第 1 行有 2 个整数 n 和 m ,代表矩阵的大(3≤n,m≤50)。 接下来 n 行,每行有 m 个整数(这些整数是 1∼1000 之间的整数,含 1 和 1000 ) 输出 输出 1 个整数,代表矩阵中孤独偶数的个数。
输入样例
3 5
3 9 10 9 5
1 10 3 4 13
8 3 9 6 3
输出样例
1
#include<iostream>
using namespace std;
int main()
{
int a[110][110]={0};
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
int cnt=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i-1][j]%2==1&&a[i+1][j]%2==1&&a[i][j-1]%2==1&&a[i][j+1]%2==1&&a[i-1][j-1]%2==1&&a[i-1][j+1]%2==1&&a[i+1][j-1]%2==1&&a[i+1][j+1]%2==1&&a[i][j]%2==0)
{
cnt++;
}
}
}
cout<<cnt;
return 0;
}
是否相邻
题目描述: 同学们在操场上排成了一个 n 行 m 列的队形,假设这个队形中所有人年龄都不同,那么给定 2 个年龄后, 请你编程判断,这 2 个年龄对应的同学是否相邻? 相邻的定义是:如果两个同学在上下左右的位置是挨在一起的,那么就算是相邻的。 比如:如下是一个 3 行 4 列的队形
8 2 3 4
5 6 7 1
9 10 11 12
这个队形中每个数字代表了每个同学的年龄。 那么这个队形中 年龄 6 和年龄 10 两个值就是相邻的 输入 第 1 行有 2 个整数 n 和 m ,分别代表队形的行和列的值( 2≤n,m≤200) 接下来 n 行,每行有 m 个整数,代表每个同学的年龄(每个同学的年龄的值在 1∼100 之间) 最后一行输入 2 个整数,代表 2 个不同年龄的值。 输出 如果两个年龄的值是相邻的,请输出字符 `Y` ,否则请输出字符 `N`
输入复制
3 3
1 2 3
4 5 6
7 8 9
2 3
输出复制
Y
#include<iostream>
using namespace std;
int main()
{
int a[110][110]={0};
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>a[i][j];
}
}
int v,w;
cin>>v>>w;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if((a[i-1][j]==w||a[i+1][j]==w||a[i][j-1]==w||a[i][j+1]==w)&&a[i][j]==v)
{
cout<<"Y";
return 0;
}
else if((a[i-1][j]==v||a[i+1][j]==v||a[i][j-1]==v||a[i][j+1]==v)&&a[i][j]==w)
{
cout<<"Y";
return 0;
}
}
}
cout<<"N";
return 0;
}
矩阵加法
题目描述: 输入两个n行m列的矩阵A和B,输出它们的和A+B。 输入 第一行包含两个整数n和m,表示矩阵的行数和列数。1 <= n <= 100,1 <= m <= 100。 接下来n行,每行m个整数,表示矩阵A的元素。 接下来n行,每行m个整数,表示矩阵B的元素。 相邻两个整数之间用单个空格隔开,每个元素均在1~1000之间。 输出 n行,每行m个整数,表示矩阵加法的结果。相邻两个整数之间用单个空格隔开。
输入复制
3 3
1 2 3
4 5 6
7 8 9
9 8 7
6 5 4
3 2 1
输出复制
10 10 10
10 10 10
10 10 10
#include<iostream>
using namespace std;
int main()
{
int a[110][110];
int b[110][110];
int n,m;
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];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
a[i][j]=a[i][j]+b[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}