C ++中的翻牌游戏

假设一张桌子上有N张卡,每张卡的两面都印有一个正整数(可能不同)。我们必须翻转任意数量的卡,然后选择一张卡。如果所选卡背面的数字X不在任何卡的正面,则数字X被称为良。我们必须找到最小的数字好吗?如果没有数字好,则返回0。在这里,fronts [i]和backs [i]代表卡i正面和背面的数字。翻页会交换前面和后面的数字,因此前面的值现在在后面,反之亦然。

因此,如果输入像fronts = [1,2,4,4,7]而backs = [1,3,4,1,3],那么输出将为2。因此,如果我们翻转第二张卡片,前值为[1,3,4,4,7],后值为[1,2,4,1,3]。我们将选择第二张卡片,该卡片的背面是2,而它的正面没有任何数字,因此2是一个好数字。

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

  • 定义一个s,n:=阵线的大小,ret:= inf

  • 对于i,范围为0至n – 1

    • 如果fronts [i] = back [i],则将fronts [i]插入s

  • 对于i,范围为0至n – 1

    • 如果fronts [i]已设置,则ret:= ret和fronts [i]的最小值

  • 对于i,范围为0至n – 1

    • 如果backs [i]未设置,则ret:= ret和backs [i]的最小值

  • 当ret = inf时返回0,否则返回。

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

示例

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   int flipgame(vector<int>& fronts, vector<int>& backs) {
      set <int> s;
      int n = fronts.size();
      int ret = INT_MAX;
      for(int i = 0; i < n; i++){
         if(fronts[i] == backs[i])s.insert(fronts[i]);
      }
      for(int i = 0; i <n; i++ ){
         if(s.count(fronts[i]) == 0) ret = min(ret, fronts[i]);
      }
      for(int i = 0; i <n; i++ ){
         if(s.count(backs[i]) == 0) ret = min(ret, backs[i]);
      }
      return ret == INT_MAX? 0 : ret;
   }
};
main(){
   vector<int> v1 = {1,2,4,4,7};
   vector<int> v2 = {1,3,4,1,3};
   Solution ob;
   cout << (ob.flipgame(v1, v2));
}

输入值

[1,2,4,4,7]
[1,3,4,1,3]

输出结果

2