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

암호 퍼즐 풀기


암호 산술 문제에서 일부 문자는 숫자를 할당하는 데 사용됩니다. 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  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