【C++题解】1997. 孤独的素数
欢迎关注本专栏《C++从零基础到信奥赛入门级(CSP-J)》
问题:1997. 孤独的素数
类型:二维数组
题目描述:
在一个 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 个整数,代表矩阵中孤独素数的个数。
样例:
输入:
3 5
3 8 10 9 5
6 10 2 4 13
8 8 9 6 3
输出:
2
完整代码如下:
#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;
}