覆面算パズルを解くためのC++プログラム
陰窩算術問題では、数字を割り当てるためにいくつかの文字が使用されます。算術演算を正しく実行するために、10個の異なる文字が0から9までの桁値を保持しているように。 2つの単語が与えられ、それらの2つの単語の加算の答えとして別の単語が与えられます。例として、「BASE」と「BALL」の2つの単語を言うと、結果は「GAMES」になります。ここで、BASEとBALLをそれらの記号の数字で追加しようとすると、答えGAMESが得られます。
注-最大10文字である必要があります。そうでない場合、解決できません。
入力
このアルゴリズムは3語かかります。
出力
どの文字が0から9までのどの数字を保持しているかが表示されます。
この場合は次のようになります。
レター | A | B | E | G | L | M | S |
値 | 4 | 2 | 1 | 0 | 5 | 9 | 6 |
アルゴリズム
この問題では、文字とそれに対応する値を含むノードを定義します。
isValid(nodeList、count、word1、word2、word3)
入力 -ノードのリスト、ノードリストの要素数、および3つの単語。
出力 -word1とword2の値の合計がword3の値と同じ場合はtrue。
Begin m := 1 for each letter i from right to left of word1, do ch := word1[i] for all elements j in the nodeList, do if nodeList[j].letter = ch, then break done val1 := val1 + (m * nodeList[j].value) m := m * 10 done m := 1 for each letter i from right to left of word2, do ch := word2[i] for all elements j in the nodeList, do if nodeList[j].letter = ch, then break done val2 := val2 + (m * nodeList[j].value) m := m * 10 done m := 1 for each letter i from right to left of word3, do ch := word3[i] for all elements j in the nodeList, do if nodeList[j].letter = ch, then break done val3 := val3 + (m * nodeList[j].value) m := m * 10 done if val3 = (val1 + val2), then return true return false End
順列(nodeList、count、n、word1、word2、word3)
入力 -ノードのリスト、リスト内のアイテムの数、割り当てられた文字の数、および3つの単語。
出力 -合計を解くためにすべての文字に値が正しく割り当てられている場合はtrue。
Begin if n letters are assigned, then for all digits i from 0 to 9, do if digit i is not used, then nodeList[n].value := i if isValid(nodeList, count, word1, word2, word3) = true for all items j in the nodeList, do show the letter and corresponding values. done return true done return fasle for all digits i from 0 to 9, do if digit i is not used, then nodeList[n].value := i mark as i is used if permutation(nodeList, count, n+1, word1, word2, word3), return true otherwise mark i as not used done return false End
例
#include <iostream> #include<vector< using namespace std; vector<int< use(10); //set 1, when one character is assigned previously struct node { char letter; int value; }; int isValid(node* nodeList, const int count, string s1, string s2, string s3) { int val1 = 0, val2 = 0, val3 = 0, m = 1, j, i; for (i = s1.length() - 1; i >= 0; i--){ //find number for first string char ch = s1[i]; for (j = 0; j < count; j++) if (nodeList[j].letter == ch) //when ch is present, break the loop break; val1 += m * nodeList[j].value; m *= 10; } m = 1; for (i = s2.length() - 1; i >= 0; i--){ //find number for second string char ch = s2[i]; for (j = 0; j < count; j++) if (nodeList[j].letter == ch) break; val2 += m * nodeList[j].value; m *= 10; } m = 1; for (i = s3.length() - 1; i >= 0; i--){ //find number for third string char ch = s3[i]; for (j = 0; j < count; j++) if (nodeList[j].letter == ch) break; val3 += m * nodeList[j].value; m *= 10; } if (val3 == (val1 + val2)) //check whether the sum is same as 3rd string or not return 1; return 0; } bool permutation(int count, node* nodeList, int n, string s1, string s2, string s3) { if (n == count - 1){ //when values are assigned for all characters for (int i = 0; i < 10; i++){ if (use[i] == 0){ // for those numbers, which are not used nodeList[n].value = i; //assign value i if (isValid(nodeList, count, s1, s2, s3) == 1){ //check validation cout << "Solution found: "; for (int j = 0; j < count; j++) //print code, which are assigned cout << " " << nodeList[j].letter << " = " << nodeList[j].value; return true; } } } return false; } for (int i = 0; i < 10; i++){ if (use[i] == 0){ // for those numbers, which are not used nodeList[n].value = i; //assign value i and mark as not available for future use use[i] = 1; if (permutation(count, nodeList, n + 1, s1, s2, s3)) //go for next characters return true; use[i] = 0; //when backtracks, make available again } } return false; } bool solvePuzzle(string s1, string s2,string s3) { int uniqueChar = 0; //Number of unique characters int len1 = s1.length(); int len2 = s2.length(); int len3 = s3.length(); vector<int> freq(26); //There are 26 different characters for (int i = 0; i < len1; i++) ++freq[s1[i] - 'A']; for (int i = 0; i < len2; i++) ++freq[s2[i] - 'A']; for (int i = 0; i < len3; i++) ++freq[s3[i] - 'A']; for (int i = 0; i < 26; i++) if (freq[i] > 0) //whose frequency is > 0, they are present uniqueChar++; if (uniqueChar > 10) { //as there are 10 digits in decimal system cout << "Invalid strings"; return 0; } node nodeList[uniqueChar]; for (int i = 0, j = 0; i < 26; i++) { //assign all characters found in three strings if (freq[i] > 0) { nodeList[j].letter = char(i + 'A'); j++; } } return permutation(uniqueChar, nodeList, 0, s1, s2, s3); } int main() { string s1 = "BASE"; string s2 = "BALL"; string s3 = "GAMES"; if (solvePuzzle(s1, s2, s3) == false) cout << "No solution"; }
出力
Solution found: A = 4 B = 2 E = 1 G = 0 L = 5 M = 9 S = 6
-
C++での十二面体の表面積のプログラム
十二面体とは何ですか? 「十二面体」という言葉はギリシャ語に由来し、十二面体は「12」を意味し、ヘドロンは「顔」を意味します。幾何学的な12面体は、12の平面を持つ3Dプラトニックまたは正多角形です。同様に、他の図の12面体にもプロパティがあり、それらは- 20の多面体頂点 30個の多面体エッジ 五角形は5面のポリゴンであるため、12個の五角形の面 以下に示すのは12面体の図です 問題 エッジが与えられた場合、プログラムは十二面体の表面積を見つける必要があります。表面積は、与えられた図形の面が占める総スペースです。 十二面体の表面積を計算するには、次の式があります- 例
-
QuickSort用のC++プログラム?
クイックソートは、比較を使用してソートされていないリスト(配列)をソートするソート手法です。クイックソートは、パーティション交換ソートとも呼ばれます。 等しいソート項目の相対的な順序が保持されないため、安定したソートではありません。クイックソートは配列を操作できるため、ソートを実行するために少量の追加メモリが必要です。常に最悪の場合のパーティションを選択するわけではないことを除いて、選択ソートと非常によく似ています。したがって、選択ソートのより適切な形式と見なすことができます。 QuickSortは、最も効率的な並べ替えアルゴリズムの1つであり、配列を小さい配列に分割することに基づいていま