C++程序检查两堆字母是否可以清空

假设有 2n 个字母,每个字母上都写有一个介于 1 到 n 之间的整数。正好有两个字母上写着相同的数字。这些字母排列成 m 个堆栈,堆栈 i 上有字母 stack[i]。我们的任务是按以下方式清空所有堆栈

  • 我们必须选择任意两个堆栈并从它们中删除顶部的字母。

  • 我们删除的字母必须在它们两个上具有相同的数字。

如果我们可以以这种方式清空 m 个堆栈,我们打印 true 否则我们返回 false。

因此,如果输入类似于 n = 3, m = 2, stacks = {{2, 1, 3}, {2, 1, 3}},那么输出将为真。

有两个堆栈,每个堆栈都有字母,上面分别写有数字 2、1、3。因此,我们可以从两个堆栈中删除并以给定的方式清空它们。

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

Define one 2D array dp

Define an array tvec

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

   k := size of stacks[i]

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

      if j < 0, then:

         insert p at the end of dp[stacks[i, j]]

         (increase tvec[p] by 1)

      p := stacks[i, j]

Define an array tp

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

   Define one queue q

   insert i into q

   while (q is not empty), do:

    if not tp[first element of q] and tvec[first element of q] is same as 0, then:

         for each element next in dp[first element of q], do:

             (decrease tvec[next] by 1)

             insert next into q

         tp[first element of q] := true

   delete first element from q

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

   if tvec[i] is not equal to 0, then:

return false

return true

示例

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

#include <bits/stdc++.h>

using namespace std;

bool solve(int n, int m, vector<vector<int>> stacks){

   vector<vector<int>> dp(n + 1);

   vector<int> tvec(n + 1);

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

      int k = stacks[i].size();

      int p;

      for(int j = 0; j < k; j++){

         if(j > 0){

            dp[stacks[i][j]].push_back(p);

            tvec[p]++;

         }

         p = stacks[i][j];

      }

   }

   vector<bool> tp(n + 1);

   for(int i = 1; i <= n; i++){

      queue<int> q;

      q.push(i);

      while(!q.empty()){

         if(!tp[q.front()] && tvec[q.front()] == 0){

            for(auto next: dp[q.front()]){

               tvec[next]--;

               q.push(next);

            }

            tp[q.front()]=true;

         }

         q.pop();

      }

   }

   for(int i = 1; i <= n; i++){

      if(tvec[i] != 0){

         return false;

      }

   }

   return true;

}

int main() {

   int n = 3, m = 2;

   vector<vector<int>> stacks = {{2, 1, 3}, {2, 1, 3}};

   cout<< solve(n, m, stacks);

   return 0;

}

输入

3, 2, {{2, 1, 3}, {2, 1, 3}}
输出结果
1

以上是 C++程序检查两堆字母是否可以清空 的全部内容, 来源链接: utcz.com/z/297212.html

回到顶部