Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

C++의 구두 산술 퍼즐

<시간/>

방정식이 있다고 가정하고 표현식은 왼쪽에 단어로 표시되고 결과는 오른쪽에 표시됩니다. 다음 규칙에 따라 방정식을 풀 수 있는지 확인해야 합니다. -

  • 각 문자는 한 자리(0 ~ 9)로 디코딩됩니다.

  • 서로 다른 문자의 모든 쌍은 서로 다른 숫자에 매핑되어야 합니다.

  • 각 단어[i]와 결과는 선행 0이 없는 숫자로 디코딩됩니다.

  • 왼쪽에 있는 숫자의 합은 오른쪽에 있는 숫자와 같습니다.

  • 방정식을 풀 수 있는지 여부를 확인합니다.

따라서 입력이 단어 =["SEND","MORE"], 결과 ="MONEY"와 같은 경우 출력은 다음과 같이 문자를 매핑할 때와 같이 True가 됩니다. Map 'S'-> 9, 'E '->5, 'N'->6, 'D'->7, 'M'->1, 'O'->0, 'R'->8, 'Y'->'2', 다음 "SEND" + "MORE" ="MONEY"는 9567 + 1085 =10652와 동일합니다.

이 문제를 해결하기 위해 다음 단계를 따릅니다. −

  • 크기가 10인 배열 i2c, 크기가 26인 배열 c2i 및 다른 배열 w

    를 정의합니다.
  • solve() 함수를 정의하면 idx, l, sum,

    가 필요합니다.
  • l이 r의 크기와 같으면 -

    • 합계가 0일 때 true를 반환

  • idx가 w의 크기와 같으면 -

    • c2i[r[l] - 'A']의 ASCII가 -1과 같지 않으면 -

      • c2i[r[l] - 'A']의 ASCII가 합계 모드 10과 같으면 -

        • 해결(0, l + 1, 합계 / 10)을 반환

    • 그렇지 않으면 i2c[sum mod 10]이 -1과 같을 때 -

      • l이 r의 크기와 같고 합계 mod 10이 0과 같으면 -

        • 거짓을 반환

      • c2i[r[l] - 'A'의 ASCII] =합계 모드 10

      • i2c[sum mod 10] =r[l] - 'A'의 ASCII

      • temp :=해결(0, l + 1, 합계 / 10)

      • c2i[r[l] - 'A'의 ASCII] =- 1

      • i2c[sum mod 10] =- 1

      • 반환 온도

    • 거짓을 반환

  • l>=w[idx]의 크기이면 -

    • 해결(idx + 1, l, 합계)을 반환

  • c2i[w[idx, l] - 'A']가 -1과 같지 않으면 -

    • l이 w[idx] 및 c2i[w[idx, l]의 크기와 같으면 - 'A']의 ASCII가 0과 같으면 -

      • 거짓을 반환

    • return solve(idx + 1, l, sum + c2i[w[idx, l] - 'A'의 ASCII])

  • initialize i :=0의 경우, i <10일 때 업데이트(i를 1만큼 증가), 수행 -

    • i2c[i]가 -1과 같지 않으면 -

      • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

    • i가 0과 같고 l이 w[idx]의 크기와 같으면 -

      • 다음 부분은 무시하고 다음 반복으로 건너뜁니다.

    • i2c[i] :=w[idx, l] - 'A'의 ASCII

    • c2i[w[idx, l] - 'A'의 ASCII] =i

    • 임시 :=해결(idx + 1, l, 합계 + i)

    • i2c[i] :=-1

    • c2i[w[idx, l] - 'A'의 ASCII] =- 1

    • temp가 0이 아니면 -

      • true를 반환

  • 거짓을 반환

  • 주요 방법에서 다음을 수행하십시오 -

  • i2c 및 c2i를 -1로 채우기

  • 배열 결과 반전

  • for initialize i :=0, i <단어 크기일 때 업데이트(i 1 증가), do−

    • 단어의 크기[i]> 결과의 크기인 경우 -

      • 거짓을 반환

    • 배열 단어 반전[i]

  • r :=결과, w :=단어

  • 해결(0, 0, 0)을 반환

이해를 돕기 위해 다음 구현을 살펴보겠습니다. −

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   char i2c[10];
   int c2i[26];
   vector<string> w;
   string r;
   bool solve(int idx, int l, int sum){
      if (l == r.size()) {
         return sum == 0;
      }
      if (idx == w.size()) {
         if (c2i[r[l] - 'A'] != -1) {
            if (c2i[r[l] - 'A'] == sum % 10) {
               return solve(0, l + 1, sum / 10);
            }
         }
         else if (i2c[sum % 10] == -1) {
            if (l == r.size() - 1 && sum % 10 == 0)
            return false;
            c2i[r[l] - 'A'] = sum % 10;
            i2c[sum % 10] = r[l] - 'A';
            bool temp = solve(0, l + 1, sum / 10);
            c2i[r[l] - 'A'] = -1;
            i2c[sum % 10] = -1;
            return temp;
         }
         return false;
      }
      if (l >= w[idx].size()) {
         return solve(idx + 1, l, sum);
      }
      if (c2i[w[idx][l] - 'A'] != -1) {
         if (l == w[idx].size() - 1 && c2i[w[idx][l] - 'A'] == 0){
            return false;
         }
         return solve(idx + 1, l, sum + c2i[w[idx][l] - 'A']);
      }
      for (int i = 0; i < 10; i++) {
         if (i2c[i] != -1)
         continue;
         if (i == 0 && l == w[idx].size() - 1)
         continue;
         i2c[i] = w[idx][l] - 'A';
         c2i[w[idx][l] - 'A'] = i;
         bool temp = solve(idx + 1, l, sum + i);
         i2c[i] = -1;
         c2i[w[idx][l] - 'A'] = -1;
         if (temp)
         return true;
      }
      return false;
   }
   bool isSolvable(vector<string>& words, string result){
      memset(i2c, -1, sizeof(i2c));
      memset(c2i, -1, sizeof(c2i));
      reverse(result.begin(), result.end());
      for (int i = 0; i < words.size(); i++) {
         if (words[i].size() > result.size())
         return false;
         reverse(words[i].begin(), words[i].end());
      }
      r = result;
      w = words;
      return solve(0, 0, 0);
   }
};
main(){
   Solution ob;
   vector<string> v = {"SEND","MORE"};
   cout << (ob.isSolvable(v, "MONEY"));
}

입력

{"SEND","MORE"}, "MONEY"

출력

1