下沙论坛

 找回密码
 注册论坛(EC通行证)

QQ登录

QQ登录

下沙大学生网QQ群8(千人群)
群号:6490324 ,验证:下沙大学生网。
用手机发布本地信息严禁群发,各种宣传贴请发表在下沙信息版块有问必答,欢迎提问 提升会员等级,助你宣传
新会员必读 大学生的论坛下沙新生必读下沙币获得方法及使用
查看: 9246|回复: 47
打印 上一主题 下一主题

有没有人想过怎么用计算机来实现24点

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
' M  s- r0 L% {4 ^7 k- p4 @' j9 k2 N8 a5 ~
偶还在想……
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩

该用户从未签到

2
发表于 2004-4-29 17:01:00 | 只看该作者
电脑爱好者上曾经有这个编程的例子
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    3
    发表于 2004-5-1 09:53:00 | 只看该作者
    穷举法吧

    该用户从未签到

    4
     楼主| 发表于 2004-5-1 21:43:00 | 只看该作者
    以下是引用yzhlinux在2004-5-1 9:53:31的发言:
    8 g8 A7 i8 u0 r  z+ L) d穷举法吧
    1 H$ _% @7 c/ l5 y4 S9 {
    那你的代码要写P4,4=4*4*4*4=256行代码??

    该用户从未签到

    5
    发表于 2004-5-2 08:14:00 | 只看该作者
    256行代码,什么意思,就算是这样,256行算多吗??
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    6
    发表于 2004-5-2 09:31:00 | 只看该作者
    当然不是的,穷举是用程序去穷举,而不是在程序里先举好,并且不是p4,元素显然不止4个,至少是七个如:A+B+C+D 就又7个字符了,而穷举就是吧A,B,C,D,+,_,*,\,(,) 这个十个元素来排列组合,组合成一个四则运算表达试,然后传递给一个计算函数得出结果,如果是24 则表达试就是我们要求的了。比如:
    3 d- W' k, m! ?0 ofunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C' f! Y* w9 C3 u* N; M5 S9 W* u( W
    function GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数6 K8 G. ?" B  S
    那么程序就好写了:
    * Z. @0 W; m2 q9 J2 ^  YGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量
    6 }4 i7 ]& ?. c) Ido{1 U4 \9 [. R2 W: X& m
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传; y+ X3 }! u" Q+ \5 A# m5 [* j
      if(GetValue(MachString)==24) break;' T& t; e1 `6 S. S  ?7 J
    }/ F' k+ n! e; l) K2 h
    print XXXXXX;
    4 J" ^  O4 L8 \4 `6 y0 m/ {$ E

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    5 K* H, H: O/ D0 r" Q$ B; Z(5-2)*8*1
    ! x* U" V$ x) E7 `- B3 R4 }- w: K% o, |, z. c, d; ]
    (5-2)*1*8
    . A# s9 D( z% r, g% l& U. {  J6 V8*(5-2)*17 U- T" f3 {# w/ d
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    0 `3 f+ v+ q: n4 P0 Z3 L
    : O. a! X- K* _! |; p, ?
    花了一个上午,终于完成了( B1 [4 k& Z0 Y0 \
    你参考参考吧,哈哈
    6 e0 o7 I$ Z) _( x+ {3 R  P0 i% _4 r; s& d! {* q

    & k5 R+ j/ n3 {% d
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    * h) Y4 \" y* k; u% c: Y
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,7 L/ x3 v; h7 j1 D+ y
    这个改过了) D3 o, i& _2 Y0 c. z; ~& [, N! T
    一个计算 24 点的小游戏: V- B$ q3 T# j9 i$ w  F" [6 c& j3 O
    VB 编写; ~. `5 B/ w" t% s' O

    ) n8 i# K8 S5 ^8 j' k& P
    - v! A, m# B. s3 m2 L& b) P3 ?
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    " |2 F( _8 z5 r3 r& ~4 Y" c: t

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include ) Y, T1 g$ X% ~0 d' H2 E9 X#include 7 w9 U0 ~" }$ [9 n1 G+ B5 P 3 ?8 M: U, d4 ]; ?8 A, ~+ H+ X; W hint EnumFormula(int min,int max,int num,int sum);2 q' w3 p% q. n8 _% Q void ShowFormula(int *Num,int *Sym,int count,int sum);, J* l. J) N; ? double GetFormulaVal(int *Num,int *Sym,int count); # q6 w0 D, ~' F; G3 Jint EnumArray(int *Num,int min,int max,int count); , b- r+ e/ F f. |/ ovoid InitArray(int *Num,int min,int max,int count);. Q5 s7 j3 v$ c/ {4 x9 N7 ^9 b1 V const char cSym[5] = {0,'+','-','*','/'};- A* h" w. ?" d; I ; d, ~- w8 n/ f4 h$ B2 C# E int main(int argc, char *argv[])! Z' r q/ V/ G {$ U. K4 z/ J: E, Q9 \: T& z% ~& A printf("总计%d个式子\n",EnumFormula(1,10,4,24)); q- |5 H' l* Z: z/ T# p- U system("PAUSE"); 1 U, d. ]8 N' L( ^% C return 0; * n* h' D" L3 S% v7 g}2 v T2 o O+ C" g9 ] - k9 k7 X; Z2 @5 X int EnumFormula(int min,int max,int num,int sum) , j4 H( y* G+ k8 S$ T* R) h{' M& p5 l y" z int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数$ b4 m8 ?# D, W' ?- R# _( v" T3 k //储存操作符号$ S$ E/ O7 Y9 @& X& p$ Z //最后一位用于穷举结束标记' G& \9 c, Z* ?5 F; {' [ // 1 - 4 代表 '+' '-' '*' '/' , H) \ d9 V" K8 L& [2 B int *FormulaSym = (int*)calloc(num,sizeof(int));0 Q9 p/ d @, B8 Z: L8 u8 z ) V4 i: j2 i$ g) f int result = 0;6 G# o2 S% F' Z! l // 初始化操作数和操作符号数组2 K' `) _( ]( i: o* v $ [0 T- ^- V1 m* V# M% @- x int i; 2 h0 A( ~/ s" |/ p3 A& A( k& c, b 0 ~% `: [3 M0 O( C, F! k _ for(i=0;i = min; * i, d/ w7 Z' [/ t1 l for(i=0;i = 1;; S; p# |! D) k8 P' p) s FormulaNum[0]--; |" Y% \% y5 q' \# [5 X- j0 J$ U5 H InitArray(FormulaNum,min,max,num); % Q; T' \# ]$ j FormulaNum[num-1]++;7 [- |. i2 F' @, `6 I: ] // 穷举操作数和操作符号组合 7 T' D. c1 b) T$ W8 O. F8 j while(FormulaSym[num-1] == 1)% U$ X) r, n# l4 Q3 F { , p8 ?$ z8 Y8 I: G1 e: h double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 9 ?. N+ g' `& v! r- e$ A if(t>-0.01 && t<0.01) b, i9 l* _! o4 |: R( Q { 4 R5 O) I4 O2 g9 I4 ] //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],6 Q8 E; O- L ?' J' W //FormulaNum[2],FormulaNum[3], 8 p# S: q9 d) T+ S+ l. U; l // FormulaSym[0],FormulaSym[1], ! O6 s# X- F1 G) U/ {# G d // FormulaSym[2],FormulaSym[3]); # ^. `3 s' A j ShowFormula(FormulaNum,FormulaSym,num,sum); ) R5 `7 D @0 a result++; 1 n) u6 }6 Y3 j% c& ~6 |7 C } q7 Y Y0 Y& L/ f - P \/ g; ~: P. m* g, u4 | // 依次穷举操作数+ _+ L9 x+ ^2 X! f; s. }* y 7 B' z$ a9 b" h0 _: b% x, A //允许数字重复的穷举 1 I5 J/ k" X0 {. G* ~) q& [ //FormulaNum[0]++;2 m' X+ N+ j i //for(i=0;FormulaNum > max && i 0 l4 o/ {, F. R, s //{ , i+ x+ O5 y* w1 l: X) ^ // FormulaNum = min; 9 o& W; \* s5 o. f# T* v. D // FormulaNum[i+1]++;3 K U2 S& \# C //}1 t: a7 {4 L: G6 B4 s( S% B0 Z) A. [: M // 操作数穷举与操作符号穷举联接$ {2 d0 o* s' r# m8 u //if(FormulaNum[num-1] > max)/ a; X. o. h" |$ Z //{( i& c2 x! Q# F, w+ m1 H0 G9 H // FormulaNum[num-1] = min; 8 t+ W. r+ b2 m4 o+ J- ~% W: W // FormulaSym[0]++; 4 v" S+ H3 w: M9 A* }& Y: W0 [ //} ! h2 y' _3 s% E 8 Q" {5 u& R7 c# t; i4 j- n // 不允许数字重复的穷举 9 r s9 M" Z+ I& s2 H // 数字必须从小到大的排列,防止重复4 l+ E- g9 D' r2 s$ b- c if((max - min)< num) exit(0); // 出错: k4 ^ }* r* U% Z % S2 m$ G0 q( \( v( L if(EnumArray(FormulaNum,min,max,num)) + H, S, f% u3 n! V {* {4 c$ L$ i; f5 F FormulaSym[0]++;+ v- c8 x' |& m+ Y InitArray(FormulaNum,min,max,num); ) @) [7 c6 x1 i( G3 r0 \ FormulaNum[num-1]++;& C$ x8 ^) d. N5 h }8 p3 G, f. Y/ z9 c* X" p. Z/ N* Y 6 T/ d7 c% i- v; b3 `% z& Q // 操作符号穷举 : s& Z/ y. e2 ^ for(i=0;FormulaSym > 4 && i( _7 e& Z7 U' q; A! \* r" w { * Y- o, n6 Z9 c; ? FormulaSym = 1; # k, x0 l. s7 |/ ]% H) @ FormulaSym[i+1]++;$ T, C- l! L- x } ! u, q7 V( e1 {8 ` ~. W5 b r& X e( T$ {) d }- a9 R' }( O% y, b$ D //释放空间( R& n; \! j f9 y" c9 s( H free(FormulaNum); / J: O/ C3 h5 q# p% B; b- E free(FormulaSym);8 f- X$ V. q6 \+ X& Z8 s2 ~ return result; ' k# d7 z- i8 d; |4 w* ~0 g}9 f9 G; \' ?" P // 计算算式结果! r6 E3 y9 p) f, v- _9 W double GetFormulaVal(int *Num,int *Sym,int count) % V6 @; F$ V- `: S3 a( `) V{ : r ]$ W6 R5 G' b; y6 Z int i,j;/ u- @) M% R3 n, L double preresult;. _4 K* C6 E6 F) x( K+ e# {1 l preresult = Num[0];, z$ b0 s: z' W1 J i=1;j=0;9 i# ]! i7 A6 ~4 H while(i, P: T8 D) R5 P9 G$ f$ P1 [' ` {; S* g% f w1 h" f& |' E4 J' c switch(Sym[j]) 2 R5 y2 K: K- [% L {3 M5 \$ q% x! \5 K. b; {5 K case 1:3 z- l. i( Q4 L. p1 V. l/ O. ~6 v preresult += Num;0 u C$ r9 ^$ \# i q& K4 a break; * K5 k/ s+ }3 {& {( B6 I: b case 2: : E/ C4 F. ?4 y# l5 |# S, E5 @* k preresult -= Num;% p' U8 Z4 e9 n$ e break; # C/ V9 n6 M0 I+ v9 F- d; C1 r case 3: ) D' J7 Z* L/ P preresult *= Num; . j A. ]" E" Y8 S' B break; ( d$ @5 M2 }1 W/ \. }( y9 a: k6 O case 4:2 e6 ?6 X3 j( U7 |) { if(Num == 0) return -1000; " i4 D m- G0 c' R# }9 b3 E preresult /= Num;( B! K/ y7 z7 p: l break;& S) b- S4 n& f5 z. F9 P( s } 1 [8 x5 ` F: w0 C( J! R( S i++;j++; 5 ^0 Y. J9 U8 S } # G! M% A* _6 N. | return preresult; //进行修正 . E$ H! X8 `+ u3 p& {% ?% w} 5 B8 r! f3 W/ G# C// 打印算式4 k8 W3 f7 M) j# ^: L void ShowFormula(int *Num,int *Sym,int count,int sum), M7 \" @& U Z1 G: X# @# R" S$ O1 Z {0 b4 @) {( a' V3 u- O8 X* K6 q0 n4 @ + O+ h1 `4 j! }, T, [ int i,j,len;$ N0 C( [5 Z" `6 P* Z0 w. }1 S z% ? char *Formula = (char*)calloc(count*4,sizeof(char));9 K0 F7 s8 s. N g: `6 D/ Z$ `3 i char temp[10]; 6 @' V3 C D+ x) u: t itoa(Num[0],Formula,10);. r! ?# @/ f$ U4 r3 I i=1;j=0; 2 o5 k$ k' _6 K! q D% ` while(i5 p' } J7 a/ I7 L8 ~4 ]' `% S { 4 x2 ?; H( O9 @, S, i2 {) H& N% Y itoa(Num,temp,10);4 J$ M. Z2 v5 Z, T( _* Z. ? len = strlen(Formula); 9 F9 R5 X5 L# a switch(Sym[j])6 N+ ~. B. o, `! D {0 d- M6 d7 e- h% d case 1: ) |8 Q7 C- ?; I0 s" X case 2:- k: G% w2 X! g# y. | Formula[len] = cSym[Sym[j]]; ' W/ [% ]$ h+ V, y7 `) y" A7 ?' B strcat(Formula,temp);5 U$ {7 V5 i$ ~* F3 y6 @ break; * E/ l) H; J7 y- p* m8 u- K! z case 3: % _, U# E3 e, f5 S. T$ \ case 4:/ b& B4 @+ L% l% j , i7 u: _& a% Z# W; S' ] // 如果上一个操作符号优先级低于当前的,应加上括号 2 z# c( T, C2 P, o if(j==0 || Sym[j-1] > 2)7 k! _- C/ N9 w ]; j b: p { ( k/ X, t& g# g j Formula[len] = cSym[Sym[j]];- G6 B# ~0 ~8 e% a strcat(Formula,temp);$ }' l* V) ?) P# z8 v% | } $ `% W% Q4 {6 K8 V$ B else . S$ k8 K# z6 W: r6 v { 3 W! ^ I# C5 q4 z) f int n;4 O3 B- O$ o7 d9 Q ? char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); & R) I) ?# q% p2 l; ]- K for(n=0;n9 K" ^) ^5 V; t; b9 E {, J8 J6 i4 ]# l5 \3 i+ l FormulaTemp[n] = Formula[n]; / {( u4 U4 l" r Formula[n] = 0;( m5 n) \2 |# }0 ^& P4 ] }* D/ ^' @5 B5 w+ ?7 |2 \ Formula[0] = '('; 9 e% Q) H8 i7 y% E( `7 ^ strcat(Formula,FormulaTemp); * R) j6 h! S$ e |7 o R free(FormulaTemp);5 h$ L) b9 W# Y: `; o; y( ]( c Formula[len+1] =')';: Y0 _8 h* m# K: c. J! \% ` Formula[len+2] = cSym[Sym[j]]; . T) C5 a/ S- w7 O2 z strcat(Formula,temp);0 D% ^# p& F9 y& h) N; P } " m+ _' T& P0 x break;9 P8 c B! z. F/ ?. n0 n, D, ^+ _ }5 f# r- v0 T) D: x! T; f4 j: i, e i++;j++;7 R [0 j& U4 d! K }; ^8 Y2 g' A( o ]% ?% ? printf("%s",Formula); # \, W: x4 `' U* v printf("=%d\n",sum);6 Q8 Y' _8 [. l. L8 D free(Formula);8 c4 w( T( T: Q }7 d" m3 a) U( s* I+ s: V+ y # ]: W) j6 `( i" R4 ^9 L // 以当前数组为基础得到一个从小到大排列的数组 * X& H3 ~4 T8 ^# {4 |// 返回非0表示穷举结束1 B% R' x5 _. ]" t7 Q0 w int EnumArray(int *Num,int min,int max,int count) 4 Y2 l$ d/ S5 c{ 8 O3 X$ a1 B1 q int i,top; " }# V C: B, y/ q9 V% O& w4 M top = count-1;. J3 I" f% D$ p$ M) f3 R2 r* R Num[top]++; 3 [3 T0 I5 z# a9 \, p/ K' T while(Num[top]>max-count+top+1 && top>=0) 9 ^+ ~9 O! B( _$ r" B2 ]! | {6 u! a( t$ j7 t& [ top--;* c# k4 v* k, V7 } Num[top]++;1 ^3 y. a* R8 w }2 V6 \) o$ |, f0 a for(i=top+1;i; T! d$ ?! N9 {2 O( g* `! p { 8 L% d" P* Y) y Num = Num[i-1]+1;) R' M- `1 a9 T. c# }& a } , R! L2 t5 f2 ^9 v* i7 ]# { if(Num[count-1] > max) return 1; 0 ~ R$ j; c2 n8 Q else return 0;' K1 X6 t3 d" V( O/ X }0 Y# D7 F# \1 c, ^% G- d ' x1 f$ n: H, x, ~: A" f& k// 不允许重复的初始化数组8 x% B+ ?' U% I# O void InitArray(int *Num,int min,int max,int count)$ v g# w8 X7 P9 C { 8 i% ]; K# Y% @3 ?# k1 I int i; ]$ ?. c" a3 G% A9 L9 S+ Y" A5 R2 V for(i=0;i=min+i;' q2 j( e, U1 \: l# O/ H2 u+ u Num[count-1]--; 5 {7 j: z; u' {( r& g} 2 T& `) S/ A; l2 r, Q' \! G: D$ R5 d5 Q$ ]4 c9 i ] " ~; R! e3 C1 ^6 Z: g' V0 Z U & M1 b: p6 I7 x4 x0 _- ~0 }$ E ~1 b/ \/ e6 B, I. o
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    1 ]+ q! j$ `% C5 T3 K9 d

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况( `2 \3 ^! {2 [5 [

    + s  g/ \9 p1 i如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言: % V P& T, k* q% b& _5 f: |#include 6 m4 `$ {- `! O2 X% \" w$ v' g #include - A% y4 L) l+ b- M: j- X( h2 x# ` C ' H# I+ `( H3 ]1 [" M. O7 A, ^ int EnumFormula(int min,int max,int num,int sum); 4 ?5 C D+ h# H void ShowFormula(int *Num,int *Sym,int count,int sum); + U& i6 B5 _ C- N5 a% k$ s6 `. C double GetFormulaVal(int *Num,int *Sym,int count);& e7 B8 x4 l1 | int EnumArray(int *Num,int min,int max,int count);" p/ y! K: Q4 E) a ^, A& Y void InitArray(int *Num,int min,int max,int count); 7 w5 r' I/ [+ q7 ~% e q const char cSym[5] = {0,'+','-','*','/'}; 9 y i6 [' ], k) g+ ?+ v4 I 3 P/ A+ \0 o. d int main(int argc, char *argv[])6 l) D& m5 Y& ?$ @) M" d {& z! F6 f# E1 ^$ `: K0 L, m/ ` printf("总计%d个式子\n",EnumFormula(1,10,4,24)); % c8 Z1 g; Y: e$ D8 C. u system("AUSE"); ) J# O% D1 {: K0 F return 0; : t5 Z r, a5 }6 l8 \* ?5 `; g }: G$ B) X/ i" H- ^& w/ e, V ( }0 Q) B( N3 Z, M1 R int EnumFormula(int min,int max,int num,int sum) $ ~/ f0 z. E/ }# q2 J8 @1 e' Z" ~ { 3 g4 |& A% P, }$ [ int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数5 h3 _1 m w: D6 S5 k9 y* } //储存操作符号 ! Z: m6 V! d$ X //最后一位用于穷举结束标记 7 h% \) y9 K( \* q3 k" S* z3 D // 1 - 4 代表 '+' '-' '*' '/' ; W3 L6 K! t" m; [& {' ]3 W int *FormulaSym = (int*)calloc(num,sizeof(int));0 a: n$ Y5 w& e; G) K 7 v4 I' [. }0 m" j int result = 0; " g/ l: W; D/ t* l8 ~ // 初始化操作数和操作符号数组- u9 |+ \2 P% g' V: M- D4 t . S- c: c$ o6 U) _/ N( e7 b int i;; ]( l( S/ R: X $ `6 H- [* N. @! y0 ?+ { for(i=0;i = min; ( R3 U5 s5 [6 c7 a9 z) _ for(i=0;i = 1;) p& a6 K1 {% v) O FormulaNum[0]--;/ _( g) n: r6 \4 l# d3 Z! q & C" n( z# r: \+ J: _/ }1 U, ^8 Q( t InitArray(FormulaNum,min,max,num);* z6 b6 k3 I* x3 L1 o FormulaNum[num-1]++;, F7 L/ Z- T6 ? // 穷举操作数和操作符号组合 ) |# ], C! N+ U( }1 e y- X while(FormulaSym[num-1] == 1)+ Z* r/ h/ d3 _5 ]! l" n7 H { ) ~0 S. O2 k& M- D/ N; m+ X double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 0 S6 j/ U- _7 s if(t>-0.01 && t<0.01) U4 | P D9 D6 L- ] s { : W/ T$ Y" O# @' e7 ?2 v9 ?3 ] //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],9 F$ \( ?# v0 _1 p8 n+ ? Q/ J //FormulaNum[2],FormulaNum[3], ( y' G b, _' C // FormulaSym[0],FormulaSym[1], - S& X# l( |$ g6 B // FormulaSym[2],FormulaSym[3]); 8 u- n+ J$ a8 k( x( h: F& @4 N ShowFormula(FormulaNum,FormulaSym,num,sum); 2 U6 K7 l& g# o/ B$ W9 n/ E6 r result++;" S* F5 `/ G% S, Z5 D, }- Z0 B3 S }/ X/ e8 T$ W7 \; Q0 s' H * A( o+ C% K& z: p8 \ // 依次穷举操作数 ) V B% B- \. J - m5 o" w5 y7 @! c2 ?# M& x. \4 D //允许数字重复的穷举# \7 h b* ^5 B$ n8 c5 { //FormulaNum[0]++; / p8 L/ @5 b' ~ Y; K: R9 @4 Z* j! O/ Q //for(i=0;FormulaNum > max && i* O$ `' Q$ ]% ~5 `" ~- @ //{ / _/ G+ c. l0 h ~( a' [$ k // FormulaNum = min;; i& S, M3 N) j% d. U' e! r // FormulaNum[i+1]++;/ M+ u$ r+ y- C) h2 [& n! R //} ' O$ @3 s6 b5 G V% R. z* O, u // 操作数穷举与操作符号穷举联接 / F% F# u6 I; ` //if(FormulaNum[num-1] > max) ' ^" `6 x0 V% S& O$ ] //{6 Y- P) C! I: B& b0 h // FormulaNum[num-1] = min;' L. G$ c/ ?/ o" v6 r& A8 T+ i // FormulaSym[0]++; m/ y9 U( ?" } X //} 7 {( _2 _3 Y$ f5 ?+ @: g2 r- O1 a; \1 i- q8 {) }7 Z& V# L // 不允许数字重复的穷举 $ ?+ a- p, B6 v$ G! g W( s, x3 g! m // 数字必须从小到大的排列,防止重复 / L! q: v. V0 ~ X3 j6 b& r2 n if((max - min)< num) exit(0); // 出错- ]+ g. D) z" q/ K# T! E5 s / U: v$ W1 X U+ l' Q/ x if(EnumArray(FormulaNum,min,max,num)) , r$ s6 G/ m: T& Y& N8 H {5 B5 ^- r5 ]3 l% n7 `( }( C- X. A FormulaSym[0]++; R$ o' X2 j5 b InitArray(FormulaNum,min,max,num); $ _% U. i% z% I4 ^ |, V" Q7 f FormulaNum[num-1]++; / ~- f6 a% r: t } . x6 J' I8 j9 }0 k) ]9 b ; r, d+ p% O$ H+ A6 b // 操作符号穷举% U4 g1 e- I0 d" X8 U for(i=0;FormulaSym > 4 && i( B9 p$ f! S7 O$ E& s {4 m8 \" l d4 C9 ^; \ FormulaSym = 1;- e3 M" \$ J; M" T7 s- X FormulaSym[i+1]++; 0 A8 I% e" o" Q) l( f }7 ?% Q, d+ s/ a: d5 z% J' T# U 8 I' b+ }: F9 C8 J( }/ j* J }% a! P( u* B U9 z& D //释放空间6 R7 c+ K7 k+ Q# z/ s7 g0 E free(FormulaNum); ; M* h2 f: B. r o* I: S free(FormulaSym);- M z7 J2 h+ A- ]9 T" ^. [ return result; ( \# m2 z) f' `" R } 4 a& l3 Y% W8 Z! J0 e& H! w // 计算算式结果8 C2 d! V: F" O# ^ double GetFormulaVal(int *Num,int *Sym,int count)3 T& W- f- ] i1 k& y {) P! I8 J0 D1 \. N1 x int i,j; 0 ^9 U. V" A7 j9 P' v double preresult; 2 N9 [% |, g, q* Q preresult = Num[0];/ V6 V# X% F1 h9 \9 h& q! Z; \% h i=1;j=0;1 F2 f2 U$ B. t5 e1 o. L, J* b while(i+ @2 C6 W8 j2 a* L {) _& [3 m4 ~% n0 y$ k switch(Sym[j]): [3 ]4 y& L' N+ G { 7 _8 s4 E& R; U case 1: + E! R$ a5 k7 H/ R5 W; f preresult += Num; 4 P4 _) k# |: X3 ^) k" G break; " c" S" y- x9 U& ^* A case 2:0 \ G7 {& E/ o. f' F/ S preresult -= Num; % {8 R* }1 N* p) I/ A# }: `" } break;4 {; ^" ?( ?1 W case 3:6 ^9 Y! U8 t% J9 K0 r preresult *= Num; % G- F! j) v9 O" Q' y# d2 E. ]! ~ break;" p/ ?7 |. V! [$ r6 @ case 4:2 h }1 F. s5 f& B- ` if(Num == 0) return -1000; ) m A' T5 J) n+ j6 m* v* g preresult /= Num; G/ ]% \& W( t5 q2 v break;& {; e2 Y1 h% Z: i$ R } 4 I7 p2 F" L" C( x, c8 n i++;j++;* t4 D2 d2 C# [( N* c& ?/ C3 J4 T }* K v! l" J2 v( r+ q return preresult; //进行修正; s& J3 o# C, v3 g5 ^! T; | } 5 ^6 w: N* L# n R+ e5 y4 q) N // 打印算式* ^ _ i/ a5 @) O) { void ShowFormula(int *Num,int *Sym,int count,int sum)' _+ P7 Q7 s Y6 @ { : t0 U* Z; L5 C1 n u % B) B; Z- H% @0 ~! n f int i,j,len;8 x8 W3 J W& t( W' ~' p$ a! T: q char *Formula = (char*)calloc(count*4,sizeof(char));* v* `- H. D- H3 p8 P8 g* E char temp[10];& R9 D& J) |' [ k, d& } itoa(Num[0],Formula,10);! O1 A: |7 }/ ` i=1;j=0;" _1 v$ L Y7 [" A P while(i3 L7 [! _, a* m+ C { - C% f/ v4 A6 q0 U itoa(Num,temp,10);/ U. G8 m8 N$ U# T len = strlen(Formula); # F/ B5 U: y) C" m& R S* v6 [$ O switch(Sym[j]) 6 { ~3 z# g7 ~. m: c5 ?# t: K6 Z( d6 l {% C% z0 Q2 i$ x( } case 1:6 h) F, t+ C: p! z+ ^ case 2:# G2 S. S2 a; K# p1 h7 p. K8 ? Formula[len] = cSym[Sym[j]]; : {' K! Z$ C9 \; w0 g7 Q+ o4 D strcat(Formula,temp); ( U+ {/ A+ a+ [+ h$ o- ?3 A' P+ X break;( `1 K3 c9 @/ r$ m$ n; A case 3:4 p$ t* ^! X/ h/ z- x* s$ P case 4:! X& B0 {" e4 u ) y( f, A) _0 z$ J" P B // 如果上一个操作符号优先级低于当前的,应加上括号 & i% I+ R/ j& s$ I' Q if(j==0 || Sym[j-1] > 2) $ r. t$ [( _2 G3 d' x0 y { / R- E: u" |+ c9 Q( i Formula[len] = cSym[Sym[j]]; 2 a! X5 R4 J9 i strcat(Formula,temp); ) h& |+ n- Z+ f7 p* |( L3 P } 4 C" { A0 ^! E9 e else & `$ A/ E" w* U* S( E { # @( j0 H4 X+ b! |3 {: i int n;1 I5 }& ^( ]6 C char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); 8 Z8 S( i/ _! R7 P for(n=0;n, W/ I$ f: D0 f( Y- O {7 R. B& p; K7 a" ]7 P* N FormulaTemp[n] = Formula[n];. z- |7 _, v' r( w8 j m1 J) c Formula[n] = 0; 2 ~9 J, U4 v* v: ?( U }$ \, {' H& @6 L9 T1 a Formula[0] = '(';/ n2 k/ u) M* D strcat(Formula,FormulaTemp); , V' X' _* F/ u- T4 _. B8 g free(FormulaTemp);( J8 Z- a7 W: K2 n: k2 m) y Formula[len+1] =')'; $ I: I2 o* E5 Q0 [) Q/ _+ T Formula[len+2] = cSym[Sym[j]]; 2 Z: Y# j: \ V6 D4 e3 k* k strcat(Formula,temp); 3 d) m/ \. D' h0 @ }4 q$ E6 R4 j ?2 R0 A break; & r6 P7 ~+ {( W! ? }, U+ z8 Z% @1 l+ m) G/ e4 N4 ^ i++;j++; : y4 j% X ~% G0 J. @8 c } 5 V* k3 p5 h# u Z0 ^ printf("%s",Formula);4 |3 y/ O9 S4 \1 ^4 K7 g printf("=%d\n",sum); 9 F) a' ^2 f. o, Z: C free(Formula); ' W" H2 C# r) u } % g. D, o/ g$ A- [* V3 C T9 t9 k9 s; t' s7 z( f" m7 C // 以当前数组为基础得到一个从小到大排列的数组- h: b' l$ [" h$ |! e+ } // 返回非0表示穷举结束 8 a K8 i0 Z5 w1 ` int EnumArray(int *Num,int min,int max,int count) t, M9 ? p7 G4 j+ U { 2 D! }# T2 ~' i int i,top;+ O; w1 O8 P1 u: ]- `1 P top = count-1; , s( y/ P' Q* G. Q Num[top]++; ( O' o. C/ ~6 f# b: }5 c; ] while(Num[top]>max-count+top+1 && top>=0) l& `7 e, p" T+ Z# O- \0 [4 e! @ {1 i. d7 U1 M" R E7 g/ P' V; D top--; + G, a3 z: b. o5 D. k5 \ Num[top]++;. n+ z @' i: c }% l8 ~" s# ]9 \" {# Y+ ^ for(i=top+1;i- T" S8 m+ x1 D) `) v2 B {1 W# \, s+ X+ Q& b! e Num = Num[i-1]+1;# Z1 I: Q0 a* \6 B } 5 {$ w0 F8 P2 c2 v/ H if(Num[count-1] > max) return 1;+ X O8 a+ g$ @ else return 0;1 X+ ~, S* j) a& l }3 W1 v5 m1 F( }# E, |/ B; e [2 j' W E( b# p. y // 不允许重复的初始化数组 ! u' R. | G3 R. e void InitArray(int *Num,int min,int max,int count) 3 O! a2 J& R3 b { ' k" z% n. p" t int i;2 Q6 S3 Q2 {$ [' B7 C for(i=0;i=min+i;7 a. _- P1 f: W$ _9 ?4 a" { Num[count-1]--;- R9 \4 a6 d0 K @ } - |# F. _+ a1 ^: }( g1 B ; H. G) ]8 e* K( E. i8 m8 V* k 8 T( X4 q4 I F! k. H 8 y+ c) V w' Y' I+ _# N ' Z- b& _' S4 V8 g0 e5 L' M
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    & ^! Z3 O; d; {) y 6 {. W0 p5 o$ X( O4 I8 j* Gprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: 3 v$ M, e2 P4 O1 J; H1+4+9+10=24, x; Z% H9 O, z* u2 F 1+5+8+10=24 . m4 S) u, R/ R1+6+7+10=24 + W; N/ S* A8 J, X& M8 t0 k, U1+6+8+9=242 [( b3 h5 \8 v8 s. Y3 r D 2+3+9+10=24 . ]3 i* ?5 P$ W$ F. X6 B2+4+8+10=24 7 c- K C ~4 L' k0 i( p% P) }; f5 n2+5+7+10=24 4 V/ [6 c. q9 V% G, q7 Q2+5+8+9=246 ~5 @$ b; w d6 ?9 s9 E, g 2+6+7+9=24) s+ G' {" Y& m0 J+ \! ^, A 3+4+7+10=24 $ t7 L# {- C3 m3+4+8+9=242 \1 Y( M) K- ?* F, ? 3+5+6+10=24 / T8 p4 t8 \: E2 ^3 z) ?3+5+7+9=24, I" o; I$ r# o+ v$ k* I 3+6+7+8=24 4 e, F( o5 p& |6 ]1 B; `1 Y2 l% I4+5+6+9=24 3 B! v7 k, r+ L! G3 k# @4+5+7+8=24 " W9 H8 r& p' \$ T6 ]! o7 ]8 W% w这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? 7 p* _ L! B. \' H; b/ f5 Y比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。, f' w6 t9 M( l4 v3 W8 u 如: 1,5,7,8 有如下方法可以算出 24 + J% g1 l- A; V- X' h((1+7)-5)*8 = 24: |% e- h. X- c1 I7 J6 K! E5 U ((7+1)-5)*8 = 241 U) C% P/ ]4 Z. ^2 s (1+7)*(8-5) = 24 ' C9 j$ H; c! {9 U3 `2 k(7+1)*(8-5) = 245 z/ U3 J$ \0 y: D ((1-5)+7)*8 = 24 3 y5 V6 ]6 V4 V0 {* B5 j) B((7-5)+1)*8 = 24 ' w/ }9 v9 I: D* R5 v(8-5)*(1+7) = 24. h) g u; R( W' Y (8-5)*(7+1) = 24 & z" m: |: O& f, h; U8*(1+7-5) = 24 6 O8 _8 H' c/ W$ r8*((1+7)-5) = 24 ( H( b2 N4 b$ L0 a3 C+ ]3 S8*(1+(7-5)) = 249 @: K4 } A+ c( W2 t* I 8*(7+1-5) = 24 & M3 R0 \& r- }4 K! d3 h$ Q8*((7+1)-5) = 24 9 n3 p* W- {( c8*(7+(1-5)) = 24& f; r( _5 x W4 h$ h 8*(1-5+7) = 24 ( x l5 s l; D8*((1-5)+7) = 249 G2 ]# l3 F' `" I2 l$ j: T* |4 w* ` 8*(7-5+1) = 24 9 R( _& _. A2 Y8*((7-5)+1) = 24 }( g1 z+ U! o; L a. `) _* S

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    1 @8 k9 X# W2 A7 y1+4+9+10=24
    " y( S" K* ]6 _7 d1+5+8+10=244 c: V& n' I8 f. {/ q
    1+6+7+10=241 V2 f* l4 g7 R  r7 u/ C9 |+ ~( l: B
    1+6+8+9=24
    5 w; Q6 C" ]% r4 ~  `; q2+3+9+10=24, ?" e* I; c1 ]) z: a
    2+4+8+10=24
    ' i/ ~1 Z' P$ d/ J5 G4 s2+5+7+10=24) o8 C; E4 H' Z5 m
    2+5+8+9=24
    ( L6 T8 o5 l& c9 g% S7 Z3 E6 u4 P2 V) _2+6+7+9=24
    * _1 b* m9 w: [# @6 y( y3+4+7+10=24# U- ^/ V& O' r2 h
    3+4+8+9=24
    ( E  j8 P" Z/ T$ f4 D3+5+6+10=24* Y2 Y( L  R& \) U2 o
    3+5+7+9=24
    * B9 K7 z( R/ _. J3 r* F3+6+7+8=24
    # C9 ]8 O) |% Z$ p4+5+6+9=24( J2 S3 T8 I8 K
    4+5+7+8=24! s" H) {4 }. M" K7 T, F4 e
    1*5+9+10=24. K$ O" W  V( ?, ]
    1*6+8+10=24
    4 X' t" j% q6 k- Z% f) c+ @1*7+8+9=24
    $ x% O% y5 W5 q+ Y8 O2*3+8+10=24. h# G5 n+ [, g2 g- s. E1 j9 E
    2*4+6+10=24
    ; F/ ^+ x" b& z2*4+7+9=24
    / i0 C! ^9 g1 a* @) r2*5+6+8=24: O6 ~& w3 m( v, L7 i+ j4 G! d
    3*4+5+7=24
    - W) e  u( K  }" k# M4*5-6+10=24
    ) a% m! i8 c5 P( I3 }8 w8 p+ Y. M(1+2)*5+9=24
    7 m8 @  G) i' D9 s$ J7 U) z3 d(1+3)*4+8=24' m5 \9 E! K$ `. d
    1*2*7+10=24; K, _" F! w5 ~, }& `0 m
    1*3*5+9=24* }, I/ X  Q4 Y+ l
    6*7-8-10=24) `! D6 Z4 [3 n- a' r6 ]: G( i
    (2+4)*5-6=24" h1 j0 S( t7 t8 _7 a6 }5 @
    2*3*5-6=24
    5 G. K5 c' [! h3 |  K, F5 L, q(1+2+3)*4=247 `) Q$ c! c1 @# \
    (1-2+4)*8=249 g: y% D0 u- F  Q, E
    (1-2+5)*6=24
    " @6 r% L) i3 ?; x(1-3+5)*8=24! t) P" d  X! X& W0 R" r( o  Z
    (1-4+6)*8=24
    ' @4 t' p0 |) W. Q* e4 Y(1-5+7)*8=24
      P% U( u* W+ R. g(2-3+4)*8=24
    % P7 W7 W, Y9 E* [; }(2-3+5)*6=24
    / x7 L& V- C' G0 [2 H(2-4+5)*8=24
    / I2 v8 a% v: B& M( D(2-5+6)*8=24
    ! u0 n1 n. \# i1 a. W+ b/ b(2-6+7)*8=24! ^2 V0 G& |8 c* K
    (3-4+5)*6=24
    4 ^1 i  ]- E0 n(4+5-6)*8=24
    - q0 n& r. |8 k% `/ b. Z) h(4+6-7)*8=24
    9 v! G+ l2 H6 `8 ?% \; A4 o8 H/ M(2*4-5)*8=24
    ( H4 w/ O' m: l" M(2*5-7)*8=24' J/ y: y- q% M
    1*2*3*4=24
    , c% H* N- j+ t1 z1/2*6*8=24
    & D% O" U+ W% H9 B! C3 i; O8 `1/3*8*9=24  M5 I1 A. ^! c
    2/3*4*9=24! p( c9 T: h$ n7 l$ p  N( R- D! x
    2/4*6*8=24
      U  j) o( k5 @* L% t  r+ R, ]2/5*6*10=247 _$ M8 |& K, c( n
    2/6*8*9=24) T/ E" Q: }2 n- @& y
    3*4/5*10=243 I. x  t" u, D$ }0 I
    5*6*8/10=24' y* g* M1 v) b( J$ i% c' `
    总计57个式子

    该用户从未签到

    14
    发表于 2004-5-2 15:22:00 | 只看该作者
    当然不会只考虑加法的情况,大概你复制的时候出现问题了,你可以下载这页最上面的那个程序/ V5 [1 h4 F9 Z9 Q/ t# l9 a
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    15
    发表于 2004-5-2 15:23:00 | 只看该作者
    to  游侠无极限  
    ) ]- r% m  u. |你的方法思路比较特别,不过似乎更浪费资源啊,如果范围是1,100,那么你的循环将更多,而目前只是 sum 的,如果加上有 -,*,/ 和括号的话,那么就更多了,并且,如果游戏中规定可以使用三角函数,那么你这样就无法穷举出来了。+ h  Y# Y8 D$ Q# Z+ v# X5 q
    参考我的代码中,由于是组合成合法的表达算式后在进行计算得到结果,判断是否24,所以对于符号的增加和三角函数的支持都很简单的实现了。都变成了字符串的组合而已
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现7 V) k- |" F& E& j2 r) U  W- q
    ' `; [- `+ G% A+ g8 ?+ s2 z

    2 e/ T- @5 M" f( W6 `% k
    2 u8 X& c/ l1 C0 j5 d" j9 I8 k$ e, \% P$ H/ y5 Q

    1 e9 f4 T/ o  W
    / Z' X7 Z: C! |' {# b+ R! x2 p
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    " V6 E8 B$ v0 i! l7 ?
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    17
    发表于 2004-5-2 15:28:00 | 只看该作者
    似乎少了很多算式
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    18
    发表于 2004-5-2 15:29:00 | 只看该作者
    另外,玩游戏的时候应该是可以重复出现的,不规定4张牌都必须不一样吧。

    该用户从未签到

    19
    发表于 2004-5-2 15:35:00 | 只看该作者
    ' x) i& a' }' g
    * u4 L. I9 w# h# i, J
    用这个好了,只不过输入的时候要按从小到大* R# j5 D8 j* ^$ N5 F

    7 O$ Y* c% F. j好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:
    , X$ j4 y( N8 Q8 u(2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现

    % a6 t! Z9 }, B1 k0 e) |9 q* _5 j; U. E. k
    本来为了防止诸如
    / ^: }- r; a0 u2 d4 R" m1*2*3*4% J% z; b- \& C4 U9 [8 j# X
    1*3*4*2
    / S; ?- h5 w1 b0 Q2*3*4*1; S$ v6 [+ Y8 d- t5 R
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    ; `, a* _6 @; [$ M5 z9 o' P  u! f
    , E5 e% a2 O& P' U$ h另外你的程序就是有这些重复的
    : n$ y$ S; _4 K. n6 i" {" b% g
    * v4 h& N7 U3 jPS:VB的程序感觉就是慢好多啊
    . d8 s5 N& }5 \: z
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    4 e7 ]8 n7 a2 P# ]- a+ D  W

    本版积分规则

    关闭

    下沙大学生网推荐上一条 /1 下一条

    快速回复 返回顶部 返回列表