24點遊戲的演算法,其中最主要的思想就是窮舉法。所謂窮舉法就是列出4個數字加減乘除的各種可能性,包括括號的演算法。我們可以將表示式分成以下幾種:首先我們將4個數設為a,b,c,d,,其中算術符號有+,-,*,/,。其中有效的表示式有a,ab-cd,等等。列出所有有效的表示式。其中我們用列舉型別將符號定義成數字常量,比如用1表示+,2表示-等。如下是我對窮舉法的一種程式語言。在程式設計的頭部要對變數做下定義。其中a,b,c,d的範圍是1到10。這就需要在定義變數的時候要有限制。在vc++中的程式設計中,在定義控制項的變數範圍可以直接填寫變數的最大和最小,在此程式設計中的最大是10,最小是1。這就給程式設計寫語句帶來了方便。
24點遊戲的演算法,其中最主要的思想就是窮舉法。所謂窮舉法就是列出4個數字加減乘除的各種可能性。我們可以將表示式分成以下幾種:首先我們將4個數設為a,b,c,d,,將其排序列出四個數的所有排序序列組合(共有a4
4=24種組合)。再進行符號的排列表示式,其中算術符號有+,—,*,/,(,)。其中有效的表示式有a*(b-c/b),a*b-c*d,等等。列出所有有效的表示式。其中我們用列舉型別將符號定義成數字常量。如下是我對窮舉法的一種程式語言。在程式設計的頭部要對變數做下定義。其中a,b,c,d的範圍是1到10。這就需要在定義變數的時候要有限制。在vc++中的mfc程式設計中,在定義控制項的變數範圍可以直接填寫變數的最大和最小,在此程式設計中的最大是10,最小是1。這就給程式設計寫語句帶來了方便(因為其自動會生成語句)。下面我介紹下窮舉法的主要實現,我們知道要實現24點的演算法,就是通過4個數字,4個運算符號和2對括號(最多為2對),通過各種組合判斷其結果是否為24。我們用a,b,c,d代替4個數字。考慮每種可能,總的演算法就有7種可能。分別為:
1沒括號的(形如a*b*c*d);
2有括號的(形如(a * b) * c * d);
3有括號的(形如(a * b * c) * d);
4有括號的(形如a * (b * c) * d);
5有括號的(形如(a * b) * (c * d));
6有括號的(形如((a * b) * c) * d);
7有括號的(形如(a * (b * c)) * d)。
接下來就是對每一種進行分析判斷。
以上就是窮舉法的基本實現演算法
首先窮舉的可行性問題。我把表示式如下分成三類:
1、 列出四個數的所有排序序列組合(共有a4
4=24種組合)。
2、 構築乙個函式,列出所有運算表示式。
3、 輸入資料計算。
**如下:
bool game24points1(int a, int b, int c, int d)
{ flag=false;
float x=a;
float y=b;
float z=c;
float w=d;
flag=calculate(x,y,z,w);
if (flag==true)
{ cout<<"\n成功!"<
24點遊戲的演算法,還有另外一種演算法。
把多元運算轉化為兩元運算,先從四個數中取出兩個數進行運算,然後把運算結果和第三個數進行運算,再把結果與第四個數進行運算。在求表示式的過程中,最難處理的就是對括號的處理,而這種思路很好的避免了對括號的處理。基於這種思路的一種演算法:
因為能使用的4種運算子 – * / 都是2元運算子,所以本文中只考慮2元運算子。2元運算子接收兩個引數,輸出計算結果,輸出的結果參與後續的計算。
由上所述,構造所有可能的表示式的演算法如下:
(1) 將4個整數放入陣列中
(2) 在陣列中取兩個數字的排列,共有 p(4,2) 種排列。對每乙個排列,
(2.1) 對 – * / 每乙個運算子,
(2.1.1) 根據此排列的兩個數字和運算子,計算結果
(2.1.2) 改表陣列:將此排列的兩個數字從陣列中去除掉,將 2.1.1 計算的結果放入陣列中
(2.1.3) 對新的陣列,重複步驟 2
(2.1.4) 恢復陣列:將此排列的兩個數字加入陣列中,將 2.1.1 計算的結果從陣列中去除掉
可見這是乙個遞迴過程。步驟 2 就是遞迴函式。當陣列中只剩下乙個數字的時候,這就是表示式的最終結果,此時遞迴結束。
在程式中,一定要注意遞迴的現場保護和恢復,也就是遞迴呼叫之前與之後,現場狀態應該保持一致。在上述演算法中,遞迴現場就是指數組,2.1.2 改變陣列以進行下一層遞迴呼叫,2.1.3 則恢復陣列,以確保當前遞迴呼叫獲得下乙個正確的排列。
括號 () 的作用只是改變運算子的優先順序,也就是運算子的計算順序。所以在以上演算法中,無需考慮括號。括號只是在輸出時需加以考慮。
bool game24points(int a, int b, int c, int d)
{ //todo: add codes here ...
flag=false;
number[0]=a;
number[1]=b;
number[2]=c;
number[3]=d;
for (int i=0;i
head.h
#include #include #include #include #include #include using namespace std;
const double epp=1e-6;
const int cont=4;
int count=0;
const int value=24;
bool flag=false;
double number[cont];
string expression[cont];
void find(int n);
bool game24points(int a, int b, int c, int d);
bool game24points1(int a, int b, int c, int d);
bool calculate(float x, float y, float z, float w);
main.cpp
#include "head.h"
void main()
{ int a;
int b;
int c;
int d;
cin>>a>>b>>c>>d;
//cout<
本文參考:
24點演算法
include typedef float cdecl type myfun float float float funadd float x,float y float funsub float x,float y float funmul float x,float y float fundiv...
24點演算法
給定四個數,計算這四個數 1 13 的 能不能得到24 佔時只實現滿足一種情況就列印 方法 窮舉法 思路 有兩種方式,1 連貫式計算 2 分隔式計算 1 連貫式計算 例如對於2 4 3 5的計算,2 4 6 6 3 18 18 5 23 2 4 3 5 2 分隔式計算 例如對於2 4 3 5的計算,...
面試失敗之24點演算法
周一風塵僕僕 上午6點抵達成都 的去參加了凡客成都研發中心的面試,雖然經歷一夜的折騰讓我感覺頭腦很不清醒,不過這種面試狀態也不錯,能讓我深刻體驗一下在不清醒狀態下進行的思考和回答問題。午飯過後便出了門,習慣了不堵車,突然覺得成都的交通真的很擁堵。到達凡客成都研發中心填完錶後等了大概10多分鐘,面試官...