24點演算法

2021-07-02 13:19:36 字數 3101 閱讀 5970

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多分鐘,面試官...