欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1997. 孤独的素数
类型:二维数组
题目描述:
在一个 n 行 m 列的矩阵王国中,生活着一些整数,其中一些是素数,一些不是素数。如果一个素数的上下左右、左上、右上、左下、右下相邻的数中都没有素数,我们就认为这是一个孤独的素数。
比如:一个 3 行 5 列的矩阵如下。
cpp
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 个整数,代表矩阵中孤独素数的个数。
样例:
输入:
cpp
3 5
3 8 10 9 5
6 10 2 4 13
8 8 9 6 3
输出:
cpp
2
完整代码如下:
cpp
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int p){
if(p<=3) return p>1;
if(p%2==0||p%3==0) return false;
for(int i=5;i*i<=p;i+=6){
if(p%i==0||p%(i+2)==0) return false;
}
return true;
}
int main(){
//一、分析问题
//已知: 一个 n 行 m 列的矩阵;
//未知:矩阵中有多少个孤独的素数?
//关系:
//二、数据定义
int n,m,t,c=0;
bool ip[51][51];
//三、数据输入
cin>>n>>m;
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
cin>>t;
ip[i][j]=isPrime(t);
}
}
//四、数据计算
for(int i=0;i<n;++i){
for(int j=0;j<m;++j){
if(ip[i][j]){
//上
if(i-1>=0&&ip[i-1][j]) continue;
//右上
if(i-1>=0&&j+1<m&&ip[i-1][j+1]) continue;
//右
if(j+1<m&&ip[i][j+1]) continue;
//右下
if(i+1<n&&j+1<m&&ip[i+1][j+1]) continue;
//下
if(i+1<n&&ip[i+1][j]) continue;
//左下
if(i+1<n&&j-1>=0&&ip[i+1][j-1]) continue;
//左
if(j-1>=0&&ip[i][j-1]) continue;
//左上
if(i-1>=0&&j-1>=0&&ip[i-1][j-1]) continue;
//八个方向都不是素数
++c;
}
}
}
//五、输出结果
cout<<c;
return 0;
}