📌  相关文章
📜  矩阵中相邻单元和为素数的单元的计数

📅  最后修改于: 2021-09-04 09:31:51             🧑  作者: Mango

给定一个M x N矩阵mat[][] ,任务是计算相邻单元格之和等于素数的单元格的数量。对于单元格x[i][j] ,只有x[i+1][j]、x[i-1][j]、x[i][j+1]x[i][j-1 ]是相邻的单元格。
例子:

先决条件:埃拉托色尼筛
方法:

  • 使用 Sieve 预先计算并存储素数。
  • 迭代整个矩阵,并为每个单元格找到所有相邻单元格的总和。
  • 如果相邻单元格的总和等于素数,则增加计数。
  • 返回计数值。

下面是上述方法的实现。

C++
// CPP program to find the cells whose
// adjacent cells's sum is prime Number
#include 
using namespace std;
#define MAX 100005
 
bool prime[MAX];
 
void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..MAX-1]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally
    // be false if i is Not a prime, else true.
    memset(prime, true, sizeof(prime));
 
    prime[0] = prime[1] = false;
 
    for (int p = 2; p * p < MAX; p++) {
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p] == true) {
            // Update all multiples of p
            // greater than or
            // equal to the square of it
            // numbers which are multiple of p and are
            // less than p^2 are already been marked.
            for (int i = p * p; i < MAX; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to count the cells having
// adjacent cell's sum
// is equal to prime
int PrimeSumCells(vector >& mat)
{
    int count = 0;
 
    int N = mat.size();
    int M = mat[0].size();
 
    // Traverse for all the cells
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
 
            int sum = 0;
 
            // i-1, j
            if (i - 1 >= 0)
                sum += mat[i - 1][j];
 
            // i+1, j
            if (i + 1 < N)
                sum += mat[i + 1][j];
 
            // i, j-1
            if (j - 1 >= 0)
                sum += mat[i][j - 1];
 
            // i, j+1
            if (j + 1 < M)
                sum += mat[i][j + 1];
 
            // If the sum is a prime number
            if (prime[sum])
                count++;
        }
    }
 
    // Return the count
    return count;
}
 
// Driver Program
int main()
{
    SieveOfEratosthenes();
 
    vector > mat = { { 1, 2, 3, 4 },
                                 { 5, 6, 7, 8 },
                                 { 9, 10, 11, 12 } };
 
    // Function call
    cout << PrimeSumCells(mat) << endl;
}


Java
// Java program to find the cells whose
// adjacent cells's sum is prime Number
class GFG{
static final int MAX = 100005;
 
static boolean []prime = new boolean[MAX];
 
static void SieveOfEratosthenes()
{
    // Create a boolean array "prime[0..MAX-1]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally
    // be false if i is Not a prime, else true.
    for (int i = 0; i < prime.length; i++)
    prime[i] = true;
 
    prime[0] = prime[1] = false;
 
    for (int p = 2; p * p < MAX; p++)
    {
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p] == true)
        {
            // Update all multiples of p
            // greater than or
            // equal to the square of it
            // numbers which are multiple of p and are
            // less than p^2 are already been marked.
            for (int i = p * p; i < MAX; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to count the cells having
// adjacent cell's sum
// is equal to prime
static int PrimeSumCells(int [][]mat)
{
    int count = 0;
 
    int N = mat.length;
    int M = mat[0].length;
 
    // Traverse for all the cells
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            int sum = 0;
 
            // i-1, j
            if (i - 1 >= 0)
                sum += mat[i - 1][j];
 
            // i+1, j
            if (i + 1 < N)
                sum += mat[i + 1][j];
 
            // i, j-1
            if (j - 1 >= 0)
                sum += mat[i][j - 1];
 
            // i, j+1
            if (j + 1 < M)
                sum += mat[i][j + 1];
 
            // If the sum is a prime number
            if (prime[sum])
                count++;
        }
    }
 
    // Return the count
    return count;
}
 
// Driver Code
public static void main(String[] args)
{
    SieveOfEratosthenes();
 
    int [][]mat = { { 1, 2, 3, 4 },
                    { 5, 6, 7, 8 },
                    { 9, 10, 11, 12 } };
 
    // Function call
    System.out.print(PrimeSumCells(mat) + "\n");
}
}
 
// This code is contributed by sapnasingh4991


Python3
# Python 3 program to
# find the cells whose
# adjacent cells's
# sum is prime Number
MAX = 100005
prime = [True] * MAX
 
def SieveOfEratosthenes():
 
    # Create a boolean array "prime[0..MAX-1]"
    # and initialize all entries it as true.
    # A value in prime[i] will finally
    # be false if i is Not a prime, else true.
    global prime
     
    prime[0] = prime[1] = False
 
    p = 2
    while p * p < MAX:
       
        # If prime[p] is not changed,
        # then it is a prime
        if (prime[p] == True):
           
            # Update all multiples of p
            # greater than or
            # equal to the square of it
            # numbers which are multiple of
            # p and are less than p^2 are
            # already been marked.
            for i in range (p * p, MAX, p):
                prime[i] = False               
        p += 1
       
# Function to count the
# cells having adjacent
# cell's sum is equal to prime
def PrimeSumCells(mat):
 
    count = 0
    N = len(mat)
    M = len(mat[0])
 
    # Traverse for all the cells
    for i in range (N):
        for j in range (M):
 
            sum = 0
 
            # i - 1, j
            if (i - 1 >= 0):
                sum += mat[i - 1][j]
 
            # i + 1, j
            if (i + 1 < N):
                sum += mat[i + 1][j]
 
            # i, j - 1
            if (j - 1 >= 0):
                sum += mat[i][j - 1]
 
            # i, j + 1
            if (j + 1 < M):
                sum += mat[i][j + 1]
 
            # If the sum is a prime number
            if (prime[sum]):
                count += 1
    
    # Return the count
    return count
 
# Driver code
if __name__ =="__main__":
       
    SieveOfEratosthenes()
    mat = [[1, 2, 3, 4],
           [5, 6, 7, 8],
           [9, 10, 11, 12]]
 
    # Function call
    print (PrimeSumCells(mat))
     
# This code is contributed by Chitranayal


C#
// C# program to find the cells whose
// adjacent cells's sum is prime Number
using System;
class GFG{
     
static readonly int MAX = 100005;
static bool []prime = new bool[MAX];
 
static void SieveOfEratosthenes()
{
    // Create a bool array "prime[0..MAX-1]"
    // and initialize all entries it as true.
    // A value in prime[i] will finally
    // be false if i is Not a prime, else true.
    for (int i = 0; i < prime.Length; i++)
    prime[i] = true;
 
    prime[0] = prime[1] = false;
 
    for (int p = 2; p * p < MAX; p++)
    {
        // If prime[p] is not changed,
        // then it is a prime
        if (prime[p] == true)
        {
            // Update all multiples of p
            // greater than or
            // equal to the square of it
            // numbers which are multiple of p and are
            // less than p^2 are already been marked.
            for (int i = p * p; i < MAX; i += p)
                prime[i] = false;
        }
    }
}
 
// Function to count the cells having
// adjacent cell's sum
// is equal to prime
static int PrimeSumCells(int [,]mat)
{
    int count = 0;
 
    int N = mat.GetLength(0);
    int M = mat.GetLength(1);
 
    // Traverse for all the cells
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < M; j++)
        {
            int sum = 0;
 
            // i-1, j
            if (i - 1 >= 0)
                sum += mat[i - 1, j];
 
            // i+1, j
            if (i + 1 < N)
                sum += mat[i + 1, j];
 
            // i, j-1
            if (j - 1 >= 0)
                sum += mat[i, j - 1];
 
            // i, j+1
            if (j + 1 < M)
                sum += mat[i, j + 1];
 
            // If the sum is a prime number
            if (prime[sum])
                count++;
        }
    }
 
    // Return the count
    return count;
}
 
// Driver Code
public static void Main(String[] args)
{
    SieveOfEratosthenes();
 
    int [,]mat = { { 1, 2, 3, 4 },
                   { 5, 6, 7, 8 },
                   { 9, 10, 11, 12 } };
 
    // Function call
    Console.Write(PrimeSumCells(mat) + "\n");
}
}
 
// This code is contributed by sapnasingh4991


Javascript


输出:
6

如果您想与行业专家一起参加直播课程,请参阅Geeks Classes Live