암호 산술 문제에서 일부 문자는 숫자를 할당하는 데 사용됩니다. 10개의 다른 문자가 산술 연산을 올바르게 수행하기 위해 0에서 9까지의 숫자 값을 보유하는 것과 같습니다. 두 단어가 주어지고 다른 단어는 그 두 단어에 대한 덧셈의 답이 주어집니다.
예를 들어 'BASE'와 'BALL'이라는 두 단어가 있고 결과는 'GAMES'라고 말할 수 있습니다. 이제 기호 숫자로 BASE와 BALL을 추가하려고 하면 GAMES라는 답이 나옵니다.
참고 &minuns; 최대 10자여야 하며, 그렇지 않으면 풀 수 없습니다.
입력 및 출력
입력:이 알고리즘은 세 단어를 사용합니다. B A S E B A L L ---------- G A M E SOutput:0 – 9 중 어떤 문자가 어떤 숫자를 포함하는지 보여줍니다. 이 경우는 다음과 같습니다. B A S E 2 4 6 1 B A L L 2 4 5 5 --------- ---- ----- 시작 0 4 9 1 6
알고리즘
이 문제에서는 문자와 해당 값을 포함하는 노드를 정의합니다.
isValid(nodeList, 개수, 단어1, 단어2, 단어3)
입력 - 노드 목록, 노드 목록의 요소 수 및 세 단어.
출력 - word1과 word2의 값의 합이 word3의 값과 같으면 참입니다.
word1의 오른쪽에서 왼쪽으로 각 문자 i에 대해 m :=1 시작, nodeList의 모든 요소 j에 대해 ch :=word1[i] 수행, nodeList[j].letter =ch이면 수행 :=val1 + (m * nodeList[j].value) m :=m * 10 done m :=word2의 오른쪽에서 왼쪽으로 각 문자 i에 대해 1, do ch :=word2[i]의 모든 요소 j에 대해 nodeList, do if nodeList[j].letter =ch, 다음 break done val2 :=val2 + (m * nodeList[j].value) m :=m * 10 done m :=오른쪽에서 왼쪽으로 각 문자 i에 대해 1 word3의 경우 nodeList의 모든 요소 j에 대해 ch :=word3[i]를 수행하고, nodeList[j].letter =ch이면 수행한 다음 val3 :=val3 + (m * nodeList[j].value) m을 중단합니다. =m * 10 val3 =(val1 + val2)인 경우 완료, true 반환 falseEnd 반환
순열(nodeList, count, n, word1, word2, word3)
입력 - 노드 목록, 목록의 항목 수, 할당된 문자 수 및 세 단어.
출력 - 합계를 풀기 위해 모든 문자에 값이 올바르게 할당된 경우 참입니다.
n개의 문자가 할당되면 시작하고 0에서 9까지의 모든 숫자 i에 대해 숫자 i가 사용되지 않으면 수행하고 nodeList[n].value :=i if isValid(nodeList, count, word1, word2, word3 ) =nodeList의 모든 항목 j에 대해 true, 문자와 해당 값을 표시합니다. done return true 0에서 9까지의 모든 숫자 i에 대해 fasle을 반환하고 숫자 i가 사용되지 않으면 수행하고 nodeList[n].value :=i는 i가 사용된 것으로 표시합니다. if permutation(nodeList, count, n+1, word1) , word2, word3), true를 반환하지 않으면 i를 사용하지 않은 것으로 표시합니다.예시
#include#include 네임스페이스 사용 std;vector use(10); // 한 문자가 할당되면 1을 설정합니다. 이전에struct node { char letter; int 값;};int isValid(노드* nodeList, const int 개수, 문자열 s1, 문자열 s2, 문자열 s3) { int val1 =0, val2 =0, val3 =0, m =1, j, i; for (i =s1.length() - 1; i>=0; i--) { //첫 번째 문자열의 숫자 찾기 char ch =s1[i]; for (j =0; j =0; i--) { //두 번째 문자열의 숫자 찾기 char ch =s2[i]; for (j =0; j =0; i--) { //세 번째 문자열의 숫자 찾기 char ch =s3[i]; for (j =0; j 주파수(26); // 26개의 다른 문자가 있습니다. for (int i =0; i 0) //주파수가> 0인 경우, uniqueChar++가 존재합니다. if (uniqueChar> 10) { //10진법은 10자리이므로 cout <<"Invalid strings"; 반환 0; } 노드 노드 목록[uniqueChar]; for (int i =0, j =0; i <26; i++) { // 세 문자열에서 찾은 모든 문자를 할당 if (freq[i]> 0) { nodeList[j].letter =char(i + 'A '); j++; } } 순열 반환(uniqueChar, nodeList, 0, s1, s2, s3);}int main() { 문자열 s1 ="BASE"; 문자열 s2 ="볼"; 문자열 s3 ="게임"; if (solvePuzzle(s1, s2, s3) ==false) cout <<"해결 방법 없음";} 출력
찾은 솔루션:A =4 B =2 E =1 G =0 L =5 M =9 S =6