資料結構實戰(一) 計算24點

2021-10-07 14:37:34 字數 3743 閱讀 1755

一副撲克牌的每張牌表示乙個數(j、q、k分別表示11、12、13,兩個司令不用)。任取4張牌,即得到1-13的數,請新增運算子(規定為加、減、乘、除四種)使之成為表示式。每個數只能參與一次運算,4個數順序可以任意組合,4個運算子任意取3個且可以重複取。運算遵從一定有限級別,可加括號控制,最終使運算結果為24.請輸出一種解決方案的表示式,用括號表示運算優先。如果沒有解決方案,則輸出-1表示無解

#include

using

namespace std;

#define n 4

//n為參與運算的數的個數

#define ans 24

//ans為結果

#define inf 2147483647

typedef

struct nodenode;

node *a[n]

[n];

double data[n]

,eps=

1.0/

13.0

/13.0

/13.0

/13.0

;int ans=0;

string st[

1170];

//不等價表示式個數為1170

bool used[

1170

],flag=

false

;void

dfs(

int dep,

int minj)

;string str

(node *x)

;double

calc

(node *x)

;void

show

(string s)

;int

main()

}if(tag)

sort

(data,data+n)

;//排序

for(i=

0;i)else

tmp-

>lchild=

null

; tmp-

>rchild=

null

; tmp-

>id=i;

tmp-

>polar=0;

a[0]

[i]=tmp;

}dfs(0

,1);

for(i=

0;i)for

(i=1

;i}for

(i=0

;iif(

!flag)

}return0;

}void

dfs(

int dep,

int minj)

}else

} tmp-

>ch=

'+';

//對這兩個數進行加減乘除的運算,利用極性及id來窮舉並去重

tmp-

>lchild=a[dep]

[i];

tmp-

>rchild=a[dep]

[j];if(

(tmp-

>lchild-

>ch!=

'-'&&tmp-

>rchild-

>ch!=

'-')

&&(tmp-

>lchild-

>ch!=tmp-

>ch)

&&(tmp-

>rchild-

>ch!=tmp-

>ch||tmp-

>lchild-

>id

>rchild-

>lchild-

>id)

)else

else

} a[dep+1]

[t]=tmp;

dfs(dep+

1,j-1)

;}tmp-

>ch=

'-';

if(a[dep]

[i]-

>ch!=

'-'&&a[dep]

[j]-

>ch!=

'-')

else

if(a[dep]

[j]-

>polar==0)

}}

tmp-

>ch=

'*';

tmp-

>lchild=a[dep]

[i];

tmp-

>rchild=a[dep]

[j];if(

(tmp-

>lchild-

>ch!=

'/'&&tmp-

>rchild-

>ch!=

'/')

&&(tmp-

>lchild-

>ch!=tmp-

>ch)

&&(tmp-

>rchild-

>ch!=tmp-

>ch||tmp-

>lchild-

>id

>rchild-

>lchild-

>id)

)else}}

tmp-

>ch=

'/';

if(a[dep]

[i]-

>ch!=

'/'&&a[dep]

[j]-

>ch!=

'/')

else

if(a[dep]

[j]-

>polar>0)

}}}}

delete tmp;}}

string str

(node *x)

elseif(

((x-

>ch==

'/')&&!

(x->rchild-

>ch>=

'a'&&x-

>rchild-

>ch<=

'z'))||

((x-

>ch==

'*'||x-

>ch==

'-')

&&(x-

>rchild-

>ch==

'+'||x-

>rchild-

>ch==

'-')))

tmp=left+x-

>ch+right;

return tmp;}}

double

calc

(node *x)

else

if(x-

>ch==

'+')

if(x-

>ch==

'-')

if(x-

>ch==

'*')

if(x-

>ch==

'/')

else}}

return tmp;

}void

show

(string s)

else

} cout<<

"=24"

<

}//共265行

參考了這篇文章。剛開始十分愚蠢地窮舉了所有情況,一種種情況來去重,寫了快1000行,看了這種方法,感覺比以前的方法不知道高到**去了。以後做題要先看看能不能用這類方法來解決,實在沒轍了再用最傻的方法做。

資料結構知識點總結(一)

1 大多數排序演算法都有比較關鍵字大小和改變指向記錄的指標或移動記錄本身兩種基本操作。2 快速排序在任何情況下都比其他排序方法速度快。3 快速排序演算法在每一趟排序中都能找到乙個元素放在其最終位置上。4 如果某種排序演算法不穩定,則該排序方法就沒有實際應用價值。5 對 n 個記錄的進行快速排序,所需...

乙個計算24點的程式

using system class twentyfourpoint private char symbolsortcard new char 448 private char tempsymbolsortcard new char 3 private expressionvalue express...

資料結構和演算法分析10 16(計算點對)

存在n個點,如果用窮舉所有距離 n n 1 2個點對 時間輔助度為o nlogn 書上有嚴格的證明能分治在nlogn的時間界完成。include include using namespace std define maxn 100 struct point 點結構體 得到兩個點的距離 double...