东方博宜题单题解(二维数组基础)附AC源码13-16题

T1 孤独的素数

说明

在一个n行m列的矩阵王国中,生活着一些整数,其中一些是素数,一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数,我们就认为这是一个孤独的素数。
比如:一个3行5列的矩阵如下。
3 8 10 9 5
6 10 2 4 13
8 8 9 6 3
这个矩阵中有2个素数,分别是第1行第1列的3,和第2行第3列的2。
请编程计算出,一个n行m列的矩阵中有多少个孤独的素数?

输入格式

第1行有2个整数n和m,代表矩阵的大小(3<=n,m<=50)
接下来n行,每行有m个整数(这些整数是1~1000之间的整数,含1和1000)

输出格式

输出1个整数,代表矩阵中孤独素数的个数。

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[60][60];
int k=0;
bool isp(int x)
{
	int b=1;
	int i=2;
	while(i*i<=x&&b==1)
	    if(x%i==0)b=0;
	    else i++;
	if(x<=1)b=0;
	return b;
}
bool udlr(int c,int r)
{
	int b=1;
	if(isp(a[c-1][r])==1)b=0;
	if(isp(a[c+1][r])==1)b=0;
	if(isp(a[c][r-1])==1)b=0;
	if(isp(a[c][r+1])==1)b=0;
	if(isp(a[c-1][r-1])==1)b=0;
	if(isp(a[c+1][r+1])==1)b=0;
	if(isp(a[c+1][r-1])==1)b=0;
	if(isp(a[c-1][r+1])==1)b=0;
	return b;
}
int main()
{
	cin>>n>>m;
	for(int c=1;c<=n;c++)
		for(int r=1;r<=m;r++)
			cin>>a[c][r];
	for(int c=1;c<=n;c++)
		for(int r=1;r<=m;r++)
			if(isp(a[c][r])==1&&udlr(c,r)==1)k++;
	cout<<k;
	return 0;
}

T2 找朋友

说明

小T喜欢和自己同龄的人交朋友,现在他排在了一个n行m列的队伍中。请问在小T所在的行和小T所在的列中,他一共能交到几个朋友?
比如:一个6行6列的矩阵如下,该矩阵中每个数字代表了一个同学的年龄。

897953
29159912
2134679
10108236
5429510
9112957

假设小T在第2行第4列,也就是他的年龄是9岁,他所在的第2行除了小T还有2个人9岁,他所在的列除了小T有3个人是9岁,因此他可以交到5个朋友。

输入格式

第1行有2个整数n和m,分别代表队形的行和列的值(2<=n,m<=200)

接下来n行,每行有m个整数,代表每个同学的年龄(每个同学的年龄的值在1~100之间)
接下来最后一行有2个整数,代表小T在第几行第几列。

输出格式

输出一个整数,代表小T可以交到的朋友的数量。

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

T3 操场换位置

说明

同学们在操场上排成了一个n行m列的队形,请将这个队形中,年龄最大的同学和年龄最小的同学交换位置,并输出交换的结果(若有多个年龄最大的同学,优先选择第一个出现的,若有多个年龄最小的同学,优先选择最后出现的)
比如:如下是一个3行4列的队形,这个队形中每个数字代表了每个同学的年龄。
8 10 18 9
15 12 10 6
17 3 12 15
这个队形中,年龄最大的同学在第1行第3列,年龄最小的同学在第3行第2列,将他们交换位置后输出结果为:
8 10 3 9
15 12 10 6
17 18 12 15

输入格式

第1行有2个整数n和m,分别代表队形的行和列的值(2<=n,m<=200)
接下来n行,每行有m个整数,代表每个同学的年龄(每个同学的年龄的值在1~100之间)

输出格式

输出n行m列,代表交换位置后的结果,每行的m个数之间用空格隔开。

#include <bits/stdc++.h>
using namespace std;
int main()
{
	int x,y,z[210][210],maxz=INT_MIN,minz=INT_MAX;
	scanf("%d%d",&x,&y);
	for(int i=0;i<x;i++)
	{
		for(int j=0;j<y;j++)
		{
			scanf("%d",&z[i][j]);
			if(z[i][j]>maxz)
			maxz=z[i][j];
			if(minz>z[i][j])
			minz=z[i][j];
		}
	}
	for(int i=0;i<x;i++)
	{
		for(int j=0;j<y;j++)
		{
			if(z[i][j]==maxz)
			cout<<minz<<' ';
			else if(minz==z[i][j])
			cout<<maxz<<' ';
			else cout<<z[i][j]<<' ';
		}
		printf("\n");
	}
	return 0;
}

T16 两个数相邻吗?

说明

同学们在操场上排成了一个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。

#include <iostream>
using namespace std;
int n,m,arr[210][210];
int x,y;
bool neigh(int i,int j)
{
	if(arr[i+1][j]==y)return 1;
	else if(arr[i-1][j]==y)return 1;
	else if(arr[i][j+1]==y)return 1;
	else if(arr[i][j-1]==y)return 1;
	else return 0;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>arr[i][j];
		}
	}
	cin>>x>>y;
	bool flag;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			if(x==arr[i][j])
			{
				flag=neigh(i,j);
			}
		}
	}
	if(flag)cout<<'Y';
	else cout<<'N';
	return 0;
}

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值