C++程序 检查矩阵的所有行是否是彼此的循环旋转

C++程序 检查矩阵的所有行是否是彼此的循环旋转

背景

在矩阵中,如果两行之间可以通过旋转得到彼此,那么我们称这两行是循环旋转的。如果一整个矩阵中的所有行都是彼此的循环旋转,那么我们就可以说这是一个循环旋转矩阵。此时,我们需要编写一个C++程序去判断一个给定的矩阵是否为循环旋转矩阵。

实现方法

为了判断矩阵是否为循环旋转矩阵,我们可以按照以下步骤进行:

  1. 按照行的字典序从小到大排序,将矩阵变成按照行字典序排序后的新矩阵。(注意不要改变原有矩阵)
  2. 以每一行为起点,逐次旋转该行,在排序后的矩阵中搜索旋转后是否存在该行的循环旋转行。
  3. 如果所有行的循环旋转行都存在,则该矩阵为循环旋转矩阵,否则不是。

接下来我们来看看代码实现。

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

// 旋转一行并返回一个字符串
string rotate(string s)
{
    string res;
    int n = s.size();
    res.resize(n);
    for (int i = 0; i < n; i++)
        res[(i + 1) % n] = s[i];
    return res;
}

// 判断两行是否循环旋转,是返回true,否则返回false
bool isSame(string s1, string s2)
{
    if (s1.size() != s2.size())
        return false;
    string temp = s1;
    for (int i = 0; i < s1.size(); i++)
    {
        temp = rotate(temp);
        if (temp == s2)
            return true;
    }
    return false;
}

// 判断矩阵是否为循环旋转矩阵
bool isCycleMatrix(vector<string>& matrix)
{
    int n = matrix.size();
    vector<string> matrixCopy = matrix;  // 拷贝排序后的矩阵,不影响原矩阵
    sort(matrixCopy.begin(), matrixCopy.end());  // 按行字典序排序

    // 遍历矩阵中所有行
    for (int i = 0; i < n; i++)
    {
        bool flag = false;
        // 在排序后的矩阵中搜索第i行的循环旋转行是否存在
        for (int j = 0; j < n; j++)
            if (isSame(matrixCopy[j], matrix[i]))  // 找到了
            {
                flag = true;
                break;
            }
        // 如果第i行的循环旋转行不存在,则该矩阵不是循环旋转矩阵
        if (!flag)
            return false;
    }
    // 所有行的循环旋转行都存在,则该矩阵是循环旋转矩阵
    return true;
}

int main()
{
    int n;
    cin >> n;
    vector<string> matrix(n);
    for (int i = 0; i < n; i++)
        cin >> matrix[i];
    if (isCycleMatrix(matrix))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
    return 0;
}

示例

接下来我们来看几个示例,测试一下我们实现的C++程序是否正确。

假设输入的矩阵为:

abcd
bcda
cdab
dabc

由于矩阵的每一行都可以通过旋转得到其他行,因此该矩阵为循环旋转矩阵,我们运行程序得到输出为:

Yes

再看一个输入的矩阵:

abc
bcd
cde

此时,第一行可以通过旋转得到第二行,第二行可以通过旋转得到第三行,但是第三行不能通过旋转得到第一行,因此该矩阵不是循环旋转矩阵,我们运行程序得到输出为:

No

结论

通过以上实现方法和示例说明,我们可以得出结论:对于一个矩阵,如果所有行之间都可以通过旋转得到彼此,那么该矩阵是循环旋转矩阵。我们可以编写一个C++程序来检查矩阵的所有行是否是彼此的循环旋转。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例