C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

24C++でのゲーム


カードが4枚あるとします。これらのカードは1から9までの数字を保持しています。24を取得するには、+、-、*、/などの演算子を使用して操作できるかどうかを確認する必要があります。したがって、[4,9,2,6 ]、次に(4 * 9)–(2 * 6)で24を得ることができ、答えは真になります。

これを解決するには、次の手順に従います-

  • イプシロン:=10.0 ^ -5
  • 関数solve()を定義します。これには、配列vが必要です。
  • vのサイズが1と同じ場合、-
    • | v[0]-24.0|の場合にtrueを返します<=イプシロン
  • iを初期化する場合:=0、i
  • jを初期化する場合:=0、j
  • iがjと同じ場合:次の部分を無視し、次の反復にスキップします
  • 配列解像度を定義する
  • kを初期化する場合:=0、k
  • iがkに等しくなく、jがkに等しくない場合、-
    • resの最後にv[k]を挿入
  • kを初期化する場合:=0、k <4の場合、更新(kを1つ増やす)、実行-
    • operator[k]が'+'と同じ場合、-
      • resの最後にv[i]+v[j]を挿入します
    • それ以外の場合、operators[k]が'-'と同じ場合、-
      • resの最後にv[i]-v[j]を挿入します
    • それ以外の場合、operators[k]が'*'と同じ場合、-
      • resの最後にv[i]*v[j]を挿入します
    • それ以外の場合
      • resの最後にv[i]/v[j]を挿入します
    • solve(res)の場合、-
      • trueを返す
    • resから最後の要素を削除する
  • falseを返す
  • メインメソッドから次の手順を実行します-
  • 配列を定義するv
  • iを初期化する場合:=0、i
  • vの最後にnums[i]を挿入
  • returnsolve(v)
  • 理解を深めるために、次の実装を見てみましょう-

    #include <bits/stdc++.h>
    using namespace std;
    class Solution {
    public:
       char operators[4] = {'+', '-', '/', '*'};
       double epsilon = pow(10.0, -5);
       bool judgePoint24(vector<int>& nums) {
          vector <double> v;
          for(int i = 0; i < nums.size(); i++){
             v.push_back(nums[i]);
          }
          return solve(v);
       }
       bool solve(vector <double> v){
          if(v.size() == 1){
             return abs(v[0] - 24.0) <= epsilon;
          }
          for(int i = 0; i < v.size(); i++){
             for(int j = 0; j < v.size(); j++){
                if(i == j) continue;
                   vector <double> res;
                for(int k = 0; k < v.size(); k++){
                   if(i != k && j != k){
                      res.push_back(v[k]);
                   }
                }
                for(int k = 0; k < 4; k++){
                   if(operators[k] == '+'){
                      res.push_back(v[i] + v[j]);
                   }else if(operators[k] == '-'){
                      res.push_back(v[i] - v[j]);
                   }else if(operators[k] == '*'){
                      res.push_back(v[i] * v[j]);
                   }else{
                      res.push_back(v[i] / v[j]);
                   }
                   if(solve(res)) return true;
                      res.pop_back();
                }
             }
          }
          return false;
       }
    };
    main(){
       Solution ob;
       vector<int> v = {4,9,2,6};
       cout << (ob.judgePoint24(v));
    }

    入力

    {4,9,2,6}

    出力

    1

    1. C++でゲームIVをジャンプする

      arrという整数の配列があるとします。最初はインデックス0にいます。1つのステップで、インデックスiからi + xにジャンプできます。ここで、i +x =0。jここで:arr[i]とarr[j]は同じであり、iとjは同じではありません。ここで、nは配列のサイズです。配列の最後のインデックスに到達するための最小ステップ数を見つける必要があります。 したがって、入力が次のような場合、 その場合、出力は3になります。インデックス0から4、3から9への3つのジャンプが必要です。 これを解決するには、次の手順に従います- 1つのマップを定義するm n:=arrのサイズ 初期

    2. C++でゲームVをジャンプする

      arrと呼ばれる整数の配列と整数dがあるとします。 1つのステップで、インデックスiから-にジャンプできます。 i + xここで、i +x