之前寫過自己的解法:http://www.shnenglu.com/izualzhy/archive/2011/11/29/161187.html
后來別人指點(diǎn)了下,于是修改了一番。
主要是幾個(gè)方面:
1.界面先暫時(shí)去掉了,主要是算法本身增加了些判斷。不過基本的想法沒有改。
2.現(xiàn)在可以計(jì)算任意的輸入了,不過我試了下,超過6個(gè)數(shù)就非常慢。。。不知道怎么修改。。。
3.寫了一個(gè)新的類記錄中間過程得到的數(shù),重寫了加減乘除等方法,這樣就可以不像用之前ABS(a-b)<1e-5的方法判斷兩個(gè)數(shù)相等。
以四個(gè)數(shù)為例,記錄下主要想法:
首先輸入的數(shù)假定為 A B C D
排列共有24種情況,設(shè)一種為 a b c d
在肯定為該排列方式的情況下,有3種加括號(hào)的方式,同時(shí)設(shè)@為加減乘除的任意一種,于是有
(a@b) c d
a (b@c) d
a b (c@d)
共3x4=12種情況,于是之后得到三個(gè)數(shù)x y z,同樣的加括號(hào)的方式有2種
(x@y) z
x (y@z)
得到兩個(gè)數(shù)m n,一種加括號(hào)的方式:
于是得到一個(gè)數(shù)
M
檢測(cè)這個(gè)M是否是目標(biāo)數(shù)值。
最近開始學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法,想盡快補(bǔ)上之前計(jì)算機(jī)系學(xué)的基本課程來。感覺這個(gè)有點(diǎn)像回溯算法。
如果你又興趣同時(shí)看完了代碼的話,希望能告訴我一下哪里在復(fù)雜度需要改進(jìn)的。
#include <iostream>
#include <stdlib.h>
#include <time.h>
using namespace std;
const int cardCounter = 4;
const double obj = 24;
//#define DEBUG
void calTwoCards(double a[], int lenA, double b[], int lenB, double src[lenA][lenB][4])
{
for ( int i=0; i<lenA; ++i)
for ( int j=0; j<lenB; ++j) {
calTwoCards(a[i], b[j], src[i][j]);
}
}
void calTwoCards(double a, double b, int lenB, double src[lenB][4])
{
for ( int i=0; i<lenB; ++i)
calTwoCards(a, b[i], src[i]);
}
void calTwoCards(double a, double b, double src[])
{
//a opeartor src[i] = b
src[0]=b+a;
src[1]=b-a;
src[2]=b*a;
src[3]=b/a;
}
char getOperator(int i)
{
if (i==0) return '+';
if (i==1) return '-';
if (i==2) return '*';
if (i==3) return '/';
}
void parseM(int m)
{
char c = getOperator(m%6);
char b = getOperator(m/6%6);
char a = getOperator(m/6/6%6);
cout << " " << a << " " << b << " " << c << endl;
}
void copy(double a[], double b[], int lenB)
{
for (int i=0; i<lenB; ++i)
a[i] = b[i];
}
void calCorrentExpression(double src[], double obj)
{
for ( int i=0; i<cardCounter; ++i) {
double srcFirst[cardCounter];
calTwoCards(src[i], obj, srcFirst);
for ( int j=0; j<cardCounter; ++j) {
if (j==i) continue;
double srcSecond[cardCounter][cardCounter];
calTwoCards(src[j], srcFirst, cardCounter, srcSecond);
for ( int p=0; p<cardCounter; ++p) {
if (p==j || p==i) continue;
double srcThird[cardCounter*cardCounter][cardCounter];
calTwoCards(src[p], srcSecond, cardCounter*cardCounter, srcThird);
for ( int q=0; q<cardCounter; ++q) {
if (q==i || q==j || q==p) continue;
for ( int m=0; m<cardCounter*cardCounter; ++m)
for ( int n=0; n<cardCounter; ++n)
if (src[q]-srcThird[m][n])
}
}
}
}
}
int main()
{
double baseDigit[4] = {5,5,5,1};
calCorrentExpression(baseDigit, 24);
return 0;
}
發(fā)表于 2011-12-25 22:45 123asdfasdf 閱讀(296) 評(píng)論(0) 編輯 收藏 引用 所屬分類: C/C++ 、數(shù)據(jù)結(jié)構(gòu)