24點小遊戲演算法
阿新 • • 發佈:2019-01-23
要求:1-9任意四個數字,利用加減乘除括號五種運算使最終結果等於24;如果能達到要求,列印所有方法(同樣的加減乘除,括號不同位置算兩種不同的方法);若不能達到要求,列印“不能計算達到24”。
思考過程:四個數字,三步運算,二個括號,而這兩個括號的位置有五種不同的情況。也就是說,不論運算子號是什麼,利用括號都可以有五種不同的運算順序。
(1)((x,y),z),w
(2)(x,y),(z,w)
(3)(x,(y,z),w)
(4)x,((y,z),w)
(5)x,((y,(z,w))
因此,我的程式碼實現過程是,由於三步運算,就利用三重迴圈。每一步迴圈定義了五個區域性變數來記錄五種情況各自的第一步的暫時結果,在最後一步進行判斷結果是否為24(在第三步迴圈之內)。如果是,則需要列印計算過程。
for (int i = 1; i < 5; i++)
{
suma = cal(i, x, y);
sumb = cal(i, x, y);
sumc = cal(i, y, z);
sumd = cal(i, y, z);
sume = cal(i, z, w);
for (int j = 1; j < 5; j++)
{
suma1 = cal(j, suma, z);
sumb1 = cal(j, z, w);
sumc1 = cal(j, x , sumc);
sumd1 = cal(j, sumd, w);
sume1 = cal(j, y, sume);
for (int k = 1; k < 5; k++)
{
suma2 = cal(k, suma1, w);
sumb2 = cal(k, sumb, sumb1);
sumc2 = cal(k, sumc1, w);
sumd2 = cal(k, x , sumd1);
sume2 = cal(k, x, sume1);
//加上判斷
//其中cal(int n,int x,int y)的功能是根據n的值決定對x,y做什麼運算,返回結果。
}
}
}
有人可能會問,是不是需要一個容器來記錄前面每一步過程做的運算?
其實是不需要的。三步迴圈,也就是三個運算子(不考慮括號,因為括號是根據五種運算順序事先就已經決定好了的。),設迴圈變數分別為i,j,k,在做最內層迴圈的時候,是有對應的i,j的,只要利用一個函式將i,j,k與運算子號相對應起來就可以了!也就是一個函式引數為0-4(1-5也可),函式體為switch…case或者if..else if…去對應運算子號即可。這樣在第三層迴圈內判斷完之後列印時,直接利用i,j,k 即可判斷運算過程。
void print(int n)
{
if (n == 1)
cout << '+';
else if (n == 2)
cout << '*';
else if (n == 3)
cout << '/';
else if (n == 4)
cout << '-';
}