1、計算方式的改變——引入分數計算概念
求24點涉及到除法,所以必須轉變直接計算的思路。經過一段時間的摸索,本人發現可以採用分數計算。任何兩個數的計算都可以轉換成對應的分數計算形式。
例如:3 / 8 可以轉換成 (3/1) / (8/1)
1.1 待計算數字的初始化
於是待計算的4個值必須先轉換成分數:
private int aarray = new int[2];
private int barray = new int[2];
private int carray = new int[2];
private int darray = new int[2];
當然,我們得初始化它們: 效果就是2->2/ 1
aarray[0] = a;
aarray[1] = 1;
barray[0] = b;
barray[1] = 1;
carray[0] = c;
carray[1] = 1;
darray[0] = d;
darray[1] = 1;
1.2 分數的計算
小學的時候就學過,分數的加減法用到最小公倍數和最大公約數。
/**
* 求最小公倍數
* * @param a
* @param b
* @return
*/public int leasecommonmultiple(int a, int b)
/*** 求最大公約數
* * @param a
* @param b
* @return
*/public int greatestcommondivisor(int a, int b)
if (0 == a)
if (0 == b)
if (a > b)
for (int c = a % b; c > 0; c = a % b)
return b;
}
對應的加減方法如下:
/**
* 加*/
public int plus(int a, int b) ;
} if (0 == b[1]) ;
} int denominator = leasecommonmultiple(a[1], b[1]);
return new int ;
} /**
* 減*
* @param a
* @param b
* @return
*/public int reduce(int a, int b) ;
} if (0 == b[1]) ;
} int denominator = leasecommonmultiple(a[1], b[1]);
return new int ;
}
相對來說,乘除方法就簡單多了:
/**
* 乘*
* @param a
* @param b
* @return
*/public int multiply(int a, int b) ;
} /**
* 除*
* @param a
* @param b
* @return
*/public int divide(int a, int b) ;
}
2、計算規則
2.1 演算法——窮舉法
24點的計算涉及到以下三種元素:
待計算的4個數、三個計算符號(加減乘除)、括號
本人採用的是窮舉法,進行乙個乙個數值和符號的嘗試——這樣的話,在迴圈中數值和符號都必須是動態的。
/**
* 動態載入符號數
* @param i
* @param a
* @param b
* @return
*/public int dispose(int i, int a, int b)else if(i == 1)else if(i == 2)else }
/*** 動態載入計算數
* @param i
* @param a
* @param b
* @param c
* @param d
* @return
*/public int number(int i, int a, int b, int c, int d)else if(i == 1)else if(i == 2)else if(i == 3)else;
} }
2.2 括號規則:
型別1:a(a(a(a,b),c),d)
型別2:a(a(a,a(b,c)),d)
型別3:a(a,a(b,a(c,d)))
型別4:a(a,a(a(b,c),d))
型別5:a(a(a,b),a(c,d))
注:a就是1個符號,a(a,b)就是指:a+b, a-b, a*b, a/b四種情況
2.3 數值與符號的窮舉
把每個數值和符號乙個進行嘗試:
i,j,k :符號
m,n,o,p :數值
for(int i = 0; i < 4; i++)}}
}}
}}
計算方法:
//型別1:a(a(a(a,b),c),d)
int result1 = dispose(k,dispose(j,dispose(i,number(m,a,b,c,d),number(n,a,b,c,d)),number(o,a,b,c,d)),number(p,a,b,c,d));
//型別2:a(a(a,a(b,c)),d)
int result2 = dispose(k,dispose(i,number(m,a,b,c,d),dispose(j,number(n,a,b,c,d),number(o,a,b,c,d))),number(p,a,b,c,d));
//型別3:a(a,a(b,a(c,d)))
int result3 = dispose(i,number(m,a,b,c,d),dispose(j,number(n,a,b,c,d),dispose(k,number(o,a,b,c,d),number(p,a,b,c,d))));
//型別4:a(a,a(a(b,c),d))
int result4 = dispose(i,number(m,a,b,c,d),dispose(k,dispose(j,number(n,a,b,c,d),number(o,a,b,c,d)),number(p,a,b,c,d)));
//型別5:a(a(a,b),a(c,d))
int result5 = dispose(j,dispose(i,number(m,a,b,c,d),number(n,a,b,c,d)),dispose(k,number(o,a,b,c,d),number(p,a,b,c,d)));
if (0 != result1[1]) }}
}if (0 != result2[1]) }}
}if (0 != result3[1]) }}
}if (0 != result4[1]) }}
}if (0 != result5[1]) }}
}
該程式目前存在的一些問題:
1)、存在括號多餘的情況——如:1 + (2 + (3 * 7))和((2 + 7) - 1) * 3
2)、結果列印耦合在核心計算方法中
Python實現24點遊戲
24點遊戲是經典的紙牌益智遊戲。我的思路是把這4個數分成2部分,前兩個數一起,後兩個數一起,先計算除前兩個數所有可能的結果和後兩個數所有可能的結果。最後將它們的結果互相計算,結果與24比較,如果等於24則成功。建立使用者類,整個遊戲的體系就是建立乙個使用者類來儲存使用者的資訊,如姓名,生命值,分數等...
Javascript實現24點遊戲
你有 4 張寫有 1 到 9 數字的牌。你需要判斷是否能通過 的運算得到 241.除法運算子 表示實數除法,而不是整數除法。例如 4 1 2 3 12 2.每個運算子對兩個數進行運算。特別是我們不能用 作為一元運算子。例如,1,1,1,1 作為輸入時,表示式 1 1 1 1 是不允許的 3.你不能將...
C 實現簡單24點遊戲
隨機生成4個代表撲克牌牌面的數字字母,程式自動列出所有可能算出24的表示式,用擅長的語言 c c j a或其他均可 實現程式解決問題。程式風格良好 使用自定義注釋模板 列出表示式無重複。以下為源 include include include include using namespace std ...