C ++程序找出是否可以从给定矩阵组成回文矩阵

假设给定一个维度为 hx w 的矩阵。该矩阵包含英文字母。我们必须创建另一个包含回文行和列的矩阵,即每一行和每一列都是回文。为此,可以从给定的矩阵中完成任何行和列的排列;但是不能更改任何元素,即不能将“a”更改为“b”。如果可以从给定的矩阵生成回文矩阵,则返回 true;否则,我们返回 false。

因此,如果输入类似于 h = 4, w = 4, mat = {"xxyy", "xyxx", "yxxy", "xyyy"},那么输出将为真。

脚步

为了解决这个问题,我们将遵循以下步骤 -

Define one map mp

Define an array count of size 4.

for initialize i := 0, when i < h, update (increase i by 1), do:

   for initialize j := 0, when j < w, update (increase j by 1), do:

       (increase tp[mat[i, j]] by 1)

for each value val in tp, do:

   increase count[second value of val mod 4] by 1

check := true

if h mod 2 is same as 0 and w mod 2 is same as 0, then:

   if count[1] + count[2] + count[3] > 0, then:

      check := false

otherwise when h mod 2 is same as 1 and w mod 2 is same as 1, then:

   if count[1] + count[3] > 1, then:

      check := false

   otherwise when count[2] > h / 2 + w / 2, then:

      check := false

Otherwise

   if count[1] + count[3] > 0, then:

      check := false

   otherwise when h mod 2 is same as 1 and count[2] > w / 2, then:

      check := false

   otherwise when w mod 2 is same as 1 and count[2] > h / 2, then:

      check := false

return check

示例

让我们看看以下实现以更好地理解 -

#include <bits/stdc++.h>

using namespace std;

const int INF = 1e9;

bool solve(int h, int w, vector<string> mat){

   map<char, int> tp;

   vector<int> count(4);

   for (int i = 0; i < h; ++i) {

      for (int j = 0; j < w; ++j)

      tp[mat[i][j]]++;

   }

   for (auto val : tp)

       count[val.second % 4]++;

   bool check = true;

   if (h % 2 == 0 && w % 2 == 0) {

      if (count[1] + count[2] + count[3] > 0)

         check = false;

   }

   else if (h % 2 == 1 && w % 2 == 1) {

      if (count[1]+count[3] > 1)

         check = false;

      else if (count[2] > h / 2 + w / 2)

         check = false;

   } else {

      if (count[1] + count[3] > 0)

         check = false;

      else if (h % 2 == 1 && count[2] > w / 2)

         check = false;

      else if (w % 2 == 1 && count[2] > h / 2)

         check = false;

   }

   return check;

}

int main() {

   int h = 4, w = 4;

   vector<string> mat = {"xxyy", "xyxx", "yxxy", "xyyy"};

   cout<< solve(h, w, mat);

   return 0;

}

输入

4, 4, {"xxyy", "xyxx", "yxxy", "xyyy"}
输出结果
1

以上是 C ++程序找出是否可以从给定矩阵组成回文矩阵 的全部内容, 来源链接: utcz.com/z/297229.html

回到顶部