子矩阵问题,小明发现奶牛们身上多了一个字母纹身

子矩阵 描述 一天早上,小明起床发现,自家的奶牛们身上都多了一个字母纹身,考虑到同学们最近正在准备参加CSP,于是他想找出这些奶牛在站成一个矩形时,在一个2*2的子矩阵内有没有出现’C’,’S’,’P’的组合,如果有请告诉他有多少个 day12-03.zip 输入 第一行两个整数n,m;表示矩阵大小(2<=n,m<=1000) 其后n行, 每行m个字符,表示每个牛身上的字母(只含大写字母) 输出 有”CSP”的个数 输入样例 1 3 4 CSCP PSPS CCSS 输出样例 1 5c++代码

#include <iostream>
using namespace std;

int main()
{
    int n, m;
    cin >> n >> m;
    char a[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 - 1; i++)
        for (int j = 0; j < m - 1; j++)
        {
            int csp[26] = { 0 };
            csp[a[i][j] - 'A'] += 1;
            csp[a[i+1][j] - 'A'] += 1;
            csp[a[i][j+1] - 'A'] += 1;
            csp[a[i+1][j+1] - 'A'] += 1;
            if (csp['C'-'A'] > 0 && csp['S'-'A'] > 0 && csp['P'-'A'] > 0)
                cnt++;
        }
    cout << cnt;
}

img

读取输入的矩阵大小,然后创建一个二维字符向量来存储奶牛身上的字母。
使用两个嵌套的循环遍历矩阵中的每个元素,并检查是否存在'C', 'S', 'P'的组合。
如果存在,则计数器增加。最后,它输出计数器的值作为结果。

#include <iostream>
#include <vector>
using namespace std;
int count(vector<vector<char>>& matrix, int n, int m) {
    int count = 0;
    for (int i = 0; i < n-1; i++) {
        for (int j = 0; j < m-1; j++) {
            if (matrix[i][j] == 'C' && matrix[i][j+1] == 'S' && matrix[i+1][j] == 'P') {
                count++;
            }
        }
    }
    return count;
}

int main() {
    int n, m;
    cin >> n >> m;
    vector<vector<char>> matrix(n, vector<char>(m));
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            cin >> matrix[i][j];
        }
    }
    int result = count(matrix, n, m);
    cout << result << endl;
    return 0;
}

#include <iostream>
#include <vector>
using namespace std;

// 判断一个子矩阵是否包含"CSP"的组合
bool contains_CSP(const vector<string>& matrix, int row, int col) {
    return matrix[row][col] == 'C' && matrix[row + 1][col] == 'S' && matrix[row][col + 1] == 'P';
}

int main() {
    int n, m;
    cin >> n >> m;
    
    vector<string> matrix(n);
    for (int i = 0; i < n; ++i) {
        cin >> matrix[i];
    }
    
    int cspCount = 0;
    for (int i = 0; i < n - 1; ++i) {
        for (int j = 0; j < m - 1; ++j) {
            if (contains_CSP(matrix, i, j)) {
                cspCount++;
            }
        }
    }
    
    cout << cspCount << endl;
    
    return 0;
}


#include <iostream>
#include <vector>
#include <string>

int main() {
   int n, m;
   std::cin >> n >> m;
   std::vector<std::string> matrix(n, std::string(m, ' '));
   for (int i = 0; i < n; ++i) {
       for (int j = 0; j < m; ++j) {
           std::cin >> matrix[i][j];
       }
   }

   int count = 0;
   for (int i = 0; i < n - 1; ++i) {
       for (int j = 0; j < m - 1; ++j) {
           std::string sub_matrix = matrix[i][j] + matrix[i][j + 1] + matrix[i + 1][j] + matrix[i + 1][j + 1];
           if (sub_matrix == "CSP") {
               ++count;
           }
       }
   }

   std::cout << count << std::endl;
   return 0;
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632

【以下回答由 GPT 生成】

def count_submatrix(n, m, matrix):
    count = 0
    for i in range(n - 1):
        for j in range(m - 1):
            if matrix[i][j] == 'C' and matrix[i][j+1] == 'S' and matrix[i+1][j] == 'P' and matrix[i+1][j+1] == 'S':
                count += 1
    return count

# 读取输入
n, m = map(int, input().split())
matrix = [input() for _ in range(n)]

# 调用函数计算子矩阵数量
result = count_submatrix(n, m, matrix)

# 输出结果
print(result)

解释:

使用双重循环遍历矩阵,依次检查每个2x2的子矩阵是否包含字母组合'C', 'S', 'P',如果是则计数器加1。最后返回计数器的值。

时间复杂度:O(n * m),其中 n 和 m 分别为矩阵的行数和列数。

空间复杂度:O(n * m),需要存储整个矩阵的数据。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^