最近應用開發的過程中出現了一個小問題,順便記錄一下原因和方法--程式設計線上
“24點遊戲是一種應用撲克牌來停止的益智類遊戲,遊戲内容是:從一副撲克牌中抽去大小王剩下52張,任意抽取4張牌,把牌面上的數(A代表1)運用加、減、乘、除和括号停止運算得出24。每張牌都必須應用一次,但不能重複應用。 有些組合有不同種算法,例如要用2,4,6,12四張牌組合成24點,可以有如下幾種組合方法: 2 + 4 + 6 + 12 = 24 4 × 6 ÷ 2 + 12 = 24 12 ÷ 4 × (6 + 2) = 24 當然,也有些組合算不出24,如1、1、1、1 和 6、7、8、8等組合。” --标題描述來自wikipedia:http://zh.wikipedia.org/wiki/24%E7%82%B9。 請完成函數can24,4張牌如果可以組成24點,傳回1,不能則傳回0。 友情提醒: 注意以下這些組合: 1 1 1 10 不可以; 6 6 6 6 可以; 5 5 5 1 可以,即可以用分數,如(5-1/5)*5 = 24; 1 1 1 11 可以;
完勝利能函數即可:
每日一道理
誰說人與人隔着遙遠的重洋,誰說心與心設着堅固的堤防?十六歲的鳥兒飛上天空,總會找到落腳的枝頭。
#include <iostream>
#include <string>
#include <cmath>
#include <sstream>
using namespace std;
const double wucha=1E-6; //浮點除法有精度損失
double num[4];
bool flag; //标記是否勝利
void game24(int n){
if(n==1){
if(fabs(num[0]-24)<=wucha){
flag=1;
return ;
}
}
if(flag)return ; //找到滿意的一組即可
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
double a,b;
a=num[i];
b=num[j];
num[j]=num[n-1]; //用最後一個元素覆寫,注意這裡的n在每次遞歸中是要遞加的
num[i] = a + b;
game24(n-1);
num[i] = a - b;
game24(n-1);
num[i] = b -a;
game24(n-1);
num[i]=a*b;
game24(n-1);
if (b != 0)
{
num[i] = a / b;
game24(n-1);
}
if (a != 0)
{
num[i] = b / a;
game24(n-1);
}
num[i]=a;
num[j]=b;
//遞歸恢複
}
}
}
int can24(int a, int b, int c, int d){
num[0]=double(a);
num[1]=double(b);
num[2]=double(c);
num[3]=double(d);
flag=0;
game24(4);
if(flag)return 1;
else return 0;
}
int main()
{
cout<<can24(6,6,6,6)<<endl;
cout<<can24(1,1,1,10)<<endl; //不可以
cout<<can24(5,5,5,1)<<endl;
cout<<can24(1,1,1,11)<<endl;
return 0;
}
文章結束給大家分享下程式員的一些笑話語錄: 與女友分手兩月有餘,精神萎靡,面帶菜色。家人介紹一女孩,昨日與其相親。女孩果然漂亮,一向吝啬的我決定破例請她吃晚飯。
選了一個蠻貴的西餐廳,點了比較貴的菜。女孩眉開眼笑,與我談得很投機。聊着聊着,她說:“我給你講個笑話吧。”“ok”
“一隻螳螂要給一隻雌蝴蝶介紹對象,見面時發現對方是隻雄蜘蛛。見面後螳螂問蝴蝶‘如何?’,‘他長的太難看了’,‘别看人家長的醜,人家還有網站呢’。”
“呵呵………”我笑。忽然她問:“你有網站嗎?”
---------------------------------
原創文章 By
程式設計和線上
---------------------------------
