算24點(point24)
【問題描述】
幾十年前全世界就流行一種數字遊戲,至今仍有人樂此不疲.在中國我們把這種遊戲稱為「算24點」。您作為遊戲者將得到4個1~9之間的自然數作為運算元,而您的任務是對這4個運算元進行適當的算術運算,要求運算結果等於24。
您可以使用的運算只有:+,-,*,/,您還可以使用()來改變運算順序。注意:所有的中間結果須是整數,所以一些除法運算是不允許的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我們給出乙個遊戲的具體例子:
若給出的4個運算元是:1、2、3、7,則一種可能的解答是1+2+3*7=24。
【輸入】
只有一行,四個1到9之間的自然數。
【輸出】
如果有解的話,只要輸出乙個解,輸出的是三行資料,分別表示運算的步驟。其中第一行是輸入的兩個數和乙個運算子和運算後的結果,第二行是第一行的結果和乙個輸入的資料、運算子、運算後的結果;第三行是第二行的結果和輸入的乙個數、運算子和「=24」。如果兩個運算元有大小的話則先輸出大的。
如果沒有解則輸出「no answer!」
【樣例】
point24.in
1 2 3 7
point24.out
2+1=3
7*3=21
21+3=24
總可能情況很少,只有4個數字和4種符號(括號),直接採用窮舉法,但要稍微處理下疊加括號問題。
但是這裡發現只有括號內有加減法運算,括號外有乘除法運算時,該括號才有意義,因此分析後發現只有4個數字時,疊加括號是沒有意義的(這裡說的不太清楚,自己稍微推一下就知道了)。**如下
#include #include #include #include using namespace std;
int a1[5],b1[4];
void gol(char f,int k,int num)
int cal(int a,int b,int num)
string cha(int a)
return p;
}string chaf(int a)
int main()
*/ //cout << endl;
memset(f,0,sizeof(f));
s=0;
for(i=1;i<=3;i++)
}} while(f[0]==0)
cout << endl;
for(i=1;i<=4;i++) a1[i]=a[i];
for(i=1;i<=3;i++) b1[i]=b[i];
anum=4;bnum=3;
for(i=1;i<=4;i++) ans[i]="";
ansnum=0;
j=1;
while(j<=bnum)
j++;
}j=1;
//cout << anum << " " << bnum << endl;
while(j<=bnum)
j++;
}//cout << anum << " " << bnum << endl;
j=1;
while(j<=bnum)
//cout << anum << " " << bnum << endl;
//cout << a1[1] << endl;
if (a1[1]==24)
return 0;
}j=s;
while(f[j]==1)
f[j]=1;
} //cout << "---------------\n";
i=3;
while(b[i]==3)
b[i]++;
}}
24點遊戲(窮舉法)
三 include include double cal double a,double b,int op op 0 1 2 3 if b 0.0 分母為0 return 999.0 else return a b bool isequal double d1,double d2 兩個浮點數是否近似...
窮舉法求解24點
看到網上更多的是推薦使用遞迴,但是自己對遞迴一向有點頭疼,所有使用窮舉法求解。vs2005下測試通過。1 2使用窮舉法求解24點。3但是仍然有乙個問題 對於1 2與2 1,因為順序的關係,4系統仍然認為其是兩個解,此問題尚待解決。5author chris 6date 2013 06 18 7 8 ...
窮舉法解24點遊戲
24點遊戲 輸入 n1,n2,n3,n4 輸出 若能通過 和括號混合運算,得到運算結果為24,則輸出乙個對應的運算表示式 窮舉法 對4個數字全排列有4 24種排列。4個數字共需要3個運算子,同乙個運算子可以重複出現,則有4x4x4 64種情況。對於4個數字而言,共有以下5中加括號的方式 a b cd...