遊戲規則:
從鍵盤輸入任意1-13的4個數,然後用算術運算子「+、一、*、/」將這四個數組成一乙個算術表示式(可加括號,每個數字只能使用1次),使得該式的運算結果為24,每輸入一次表示式,系統給出該式的運算結果,如果結果是24,則遊戲結束;如果不是,則繼續組合表示式,直到結果為24為止。
本題最簡單的解法就是應用窮舉法搜尋整個解的空間,然後篩選出符合項的全部解,因此關鍵就是如何確定該題的解題空間。
假設輸入4個整數,a,b,c,d,如果只考慮括號不考慮優先順序的情況,有一下幾種情況:
(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)
即在□輸入「+、-、*、/」中的任意一種。我們就是在填入的所有式子中所得到的答案裡面找出答案為24的表示式。
我們在不同的地方設定不同的變數,即:op1、op2、op3,並且規定a和b之間的運算子為op1,b和c之間的運算子為op2,c和d之間的運算子為op3。即:
a op1 b op2 c op3 d
又規定op1、op2、op3的取值範圍為1、2、3、4分別為加減乘除,如表所示:
op1、op2、op3變數值
表示的運算1+
2-3*
4/此時就得到了以下演算法:
for
(op1=
1;op1<=
4;op1++
)for
(op2=
1;op2<=
4;op2++
)for
(op3=
1;op3<=
4;op3++
)
下面我們要填入符號,根據括號和優先順序的限制,我們有以下的填入方式
(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)
根據優先順序來說,以上五種情況包括了全部的算式,我們只需計算出每個表示式的值,將其與24進行比較。
float calculate_model1
(float i,float j,float k,float t,
int op1,int op2,int op3)
float calculate_model2
(float i,float j,float k,float t,
int op1,int op2,int op3)
float calculate_model3
(float i,float j,float k,float t,
int op1,int op2,int op3)
float calculate_model4
(float i,float j,float k,float t,
int op1,int op2,int op3)
float calculate_model5
(float i,float j,float k,float t,
int op1,int op2,int op3)
上述演算法中,每乙個函式對應一種表示式型別, 其返回值為表示式的值,原表示式式的形式為i opl j op2 k op3 t
,不同的表示式型別,根據其運算時優先順序的不同進行不同的運算。其中函式cal()的作用是通過每種表示式的狀態計算出對應的表示式的值。
int op1,op2,op3;
int flag=0;
for(op1=
1;op1<=
4;op1++
)for
(op2=
1;op2<=
4;op2++
)for
(op3=
1;op3<=
4;op3++
)
op1、op2、op3都是取「+」,「-」,「*」,「/」四個選項函式cal()包括3個引數,第3個引數為運算子變數,它標誌著不同種類的運算子,前兩個引數為運算數。該函式的作用是使用前兩個引數指定的運算元進行第3個引數指定的運算,並返回其運算結果。例如函式呼叫cal(2,3.1)的作用是計算2+3=5.並返回5。函式cal0的**如下:
float cal
(float x,float y,int op)
}
將上面所講的演算法進行結合,可以遍歷由4個運算元(範圍:1-13), 3個運算子(+,-,*,/),這樣就縮小了搜尋空間,提高查詢效率。
main()
如果這四位數小於1或者大於13,則報錯。
if
(i==j||i==k || i==t||j==k || j==t||k==t)
如果這四位數有一位以上的數輸入了2遍,則報錯(題目要求只能用一次)
if
(get24
(i,j,k,t));
else
}
如果這四個數通過運算不等於24,則需要重新輸入4位數重新計算
goto loop;表示繼續執行不退出。以下是完整**:
#include
char op[5]
=;float cal
(float x,float y,int op)
}float calculate_model1
(float i,float j,float k,float t,int op1,int op2,int op3)
float calculate_model2
(float i,float j,float k,float t,int op1,int op2,int op3)
float calculate_model3
(float i,float j,float k,float t,int op1,int op2,int op3)
float calculate_model4
(float i,float j,float k,float t,int op1,int op2,int op3)
float calculate_model5
(float i,float j,float k,float t,int op1,int op2,int op3)
get24
(int i,int j,int k,int t)if(
calculate_model2
(i,j,k,t,op1,op2,op3)
==24)if
(calculate_model3
(i,j,k,t,op1,op2,op3)
==24)if
(calculate_model4
(i,j,k,t,op1,op2,op3)
==24)if
(calculate_model5
(i,j,k,t,op1,op2,op3)
==24)}
return flag;
}main()
if(i==j||i==k || i==t||j==k || j==t||k==t)if(
get24
(i,j,k,t));
else
}
此時改程式已經可以成功實現。 C語言實現紙牌24點小遊戲
此程式參考c語言實現經典24點紙牌益智遊戲,並做出一些改進。一 題目要求 24點遊戲規則 從撲克中每次取出4張牌。使用加減乘除,第乙個能得出24者為贏。其中,j代表11,q代表12,k代表13,a代表1 按照要求程式設計解決24點遊戲。基本要求 隨機生成4個代表撲克牌牌面的數字字母,程式自動列出所有...
24點小遊戲(c語言)
24點遊戲,輸入四個數字,分別進行加減乘除四則運算結果為 24的輸出成立表示式。include include 本函式用於判斷符號的種類 char operator signaltype int signal i 對兩個數進行算術運算 double operation double a,double...
go語言實現24點遊戲
24點 是一種數學遊戲,正如象棋 圍棋一樣是一種人們喜聞樂見的娛樂活動。它始於何年何月已無從考究,但它以自己獨具的數學魅力和豐富的內涵正逐漸被越來越多的人們所接受。今天就為大家分享一道關於 24點 的演算法題目。話不多說,直接看題。第679題 24點遊戲 你有 4 張寫有 1 到 9 數字的牌。你需...