下沙论坛

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

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
2 W5 t. Q  `; N: x, |
# j, ?9 m4 {5 ~. f" K偶还在想……
分享到:  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的发言:
    2 m  a$ d, D/ K. F$ L* j1 V+ L穷举法吧

    6 Z- S9 J, s1 F( x那你的代码要写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 则表达试就是我们要求的了。比如:
    0 ]7 d( ~  O, b" [) o, ~  X7 f* \2 wfunction GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C; n6 ~% E9 g" r
    function GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    & C* d$ J) T+ {那么程序就好写了:
    2 F, Q8 p* x9 a$ A: qGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量" V2 b! Q3 v( v0 N7 ^9 D
    do{4 h* O4 F/ D% E: b
      MachString = GetMach(A,B,C,D); '得到一个表达试的字符传
    " T5 C- [/ E  T1 e5 h. O  if(GetValue(MachString)==24) break;
    0 e7 u  G7 g5 z}! P0 M& v1 ^, a/ h' o& u; p
    print XXXXXX;
    . b( ~+ C# v% o" F$ l5 }, |, m

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    9 P7 h! G) Z! e: ?1 h: R5 |, E(5-2)*8*1
    : ]- g" ~5 Z8 w
    - \0 [1 b( q, K) ]- \1 g(5-2)*1*8
    ( _, K) f. B1 _( `& i8 g- E8*(5-2)*1
    / m# X5 a. x2 I9 d2 o1 W* }& m等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者

    & F% q" n4 v) y$ Q" u( b3 h' W# M
    . c5 M, g  {# E& ]* A) `花了一个上午,终于完成了7 I* F2 s' v2 c
    你参考参考吧,哈哈
    2 B" B3 S: G' ~" i
      s: x% r4 B% U* }2 N' A$ E( a' A2 z  H8 j, P( _( d: c, }
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]

    2 G& u7 T+ ^7 z. n9 z) t; n
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,
    1 z# q* n5 J. v! s这个改过了
    3 j+ [$ [) O# M2 E0 r一个计算 24 点的小游戏
    5 g. U$ Z5 F0 O8 j+ z$ uVB 编写4 C9 d! `; J3 \; n5 f: H; u

    ( B. }2 [% G1 x" s6 p+ ^/ A
    # o& J1 L8 ]* U5 V& R3 K
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]

    7 U8 O% a/ c8 _" G

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include * ^0 w0 m/ b( g0 V6 h q #include 7 b& m& A# K' V8 R% m' C' o6 I2 b 9 M( h; i0 G' E2 f9 |int EnumFormula(int min,int max,int num,int sum); 3 L1 E) b( b2 Q: C3 W8 A) ^8 C% S B& Ivoid ShowFormula(int *Num,int *Sym,int count,int sum); Z8 A& ?5 X/ ndouble GetFormulaVal(int *Num,int *Sym,int count); + F7 P# S3 n5 A6 g) @ l! ]int EnumArray(int *Num,int min,int max,int count);. ^' b$ G3 q, U' @ void InitArray(int *Num,int min,int max,int count);$ {9 {5 m; }) v const char cSym[5] = {0,'+','-','*','/'}; ; y l& v) C1 |7 P1 b # j3 i0 h4 ^- p: c* p, k0 M7 Zint main(int argc, char *argv[]) $ m& _/ |1 K) G( G: F6 @, x{1 ~ y2 Z/ G2 @" U. k/ y2 r printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 5 a- |6 B$ L8 ]: i! W1 ]2 ?5 V system("PAUSE"); # X) |( r: {! K @ @4 p return 0; 1 x( d6 L+ G1 H+ K$ R- B}8 W" j7 D4 ^. T- t1 B W& { 9 t& g+ f4 _" ~0 |, z& R: P int EnumFormula(int min,int max,int num,int sum): j6 H2 g# g# N8 l1 L3 R/ f {/ N9 G8 C$ F( ?( z1 x: L int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数 3 n6 {% b. t) f* V4 K' f. x //储存操作符号6 ]1 {; A1 L5 P, b //最后一位用于穷举结束标记& E; {9 r% }. @: R // 1 - 4 代表 '+' '-' '*' '/'; C& `6 F+ l- q E+ I4 C+ e int *FormulaSym = (int*)calloc(num,sizeof(int));: q) p) y: e: ~ ! b- |% E& f+ t int result = 0; ' k8 n9 F$ Y, B: O: F! d // 初始化操作数和操作符号数组 / E6 }: Q) \# s- D, k 3 {( l; U# `. i% H1 X. I int i; I. `( j4 i5 K/ O + N0 V8 h/ v" h( c2 I. D5 i! V; V for(i=0;i = min;) q" l- d9 w2 L9 q for(i=0;i = 1; ) N/ F/ @& r6 x8 y3 U3 }; ` w, i FormulaNum[0]--; ) O; [0 j# i s a. E% }7 d' e1 v& I7 Q InitArray(FormulaNum,min,max,num); * X3 Y/ C8 {6 `. u4 ~ FormulaNum[num-1]++; h2 `1 y$ l2 P7 M# m$ g: w: B. o' T // 穷举操作数和操作符号组合 0 s1 P# U$ L2 z% x7 } while(FormulaSym[num-1] == 1) , K& q) ]7 W6 Y C9 Z: k+ O% Z0 t { 5 S0 H Y% ?- D* x0 Q; Z" A8 x2 M) @ double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 4 [, w$ U- \& p6 z$ p if(t>-0.01 && t<0.01) ; A( q' S, M# W {+ ^) w/ K9 d/ P* } //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], Z5 ]; a! c7 C4 R: K" M //FormulaNum[2],FormulaNum[3], ; n' h2 B- X# u // FormulaSym[0],FormulaSym[1],; ^' I% h! m! t T8 H/ Y // FormulaSym[2],FormulaSym[3]); * {% z" {4 `, a2 M ShowFormula(FormulaNum,FormulaSym,num,sum); 9 C; }" _$ i# R* P7 ?6 m7 |3 a P result++;6 w! P# y% H A: p. L } 0 @3 ^7 @& B! b' Z" h; |9 P+ C8 B7 R 5 }* V a& y$ f // 依次穷举操作数 ! h# E, d. i3 v9 b: [; Q, B $ t o6 M5 q1 R- J+ ~3 F% D$ J //允许数字重复的穷举 / v( I& t6 e. M! \2 q4 {/ F6 w+ g //FormulaNum[0]++; 0 P9 Y; F% Y5 o //for(i=0;FormulaNum > max && i* o" s* h& m, ?' o% K1 x8 a //{7 @6 ~" }- z5 e2 Z: r( k // FormulaNum = min; # p! f. i, v2 G, u9 w& t; w( A. F // FormulaNum[i+1]++; 4 d' c# c& I+ S/ {8 e; _2 U1 X3 u //} # c5 s M$ ^8 m // 操作数穷举与操作符号穷举联接. w4 H* _9 ?9 @+ Q& C2 a //if(FormulaNum[num-1] > max) & z$ Q( H- S% @* f8 z1 z/ G' W9 @ //{0 t/ ]: `9 D, o5 R // FormulaNum[num-1] = min; ) W5 l0 d8 x; S( I" S0 [ // FormulaSym[0]++; j- ^' x3 b) ^: ` //} 5 T& H) D& [3 G) y ( }2 I) x7 |. K // 不允许数字重复的穷举6 D I- H' T9 R! I // 数字必须从小到大的排列,防止重复4 q1 [* X% T: F, n% a, V" w9 _ if((max - min)< num) exit(0); // 出错 9 \% s. A! |8 h# g z/ ?, g8 Y7 E8 B" ~* Z( |' S if(EnumArray(FormulaNum,min,max,num)) % O- R7 W9 A" W) C8 C5 {5 M7 X {" Q( k0 o9 h9 o w% d( @5 R- ^ FormulaSym[0]++;' M# Y! ?3 z4 E- H c- r InitArray(FormulaNum,min,max,num); 4 o: V. L: v" Q& [, s FormulaNum[num-1]++;3 d# ~3 h% p* K% j7 ^' v } , `; w3 A0 m5 s9 }3 C" A! l5 O : C* }+ m. e1 {$ ^ // 操作符号穷举) j6 m; P4 o5 M for(i=0;FormulaSym > 4 && i& {/ W0 Y& S/ T( f- ^ { + A' \) d% @- G6 i2 |6 ~" S FormulaSym = 1; % y/ a" m; g. v" l( n T( w FormulaSym[i+1]++;6 v% e- \$ N; Y$ e/ }2 F: Q4 S } 5 P& m( m6 I$ C: W" O1 ~7 D: _. f7 A3 K' {5 T$ p3 g } 9 T3 p- H7 U# Z0 H3 O //释放空间1 L5 Q; W4 q* i7 j/ R free(FormulaNum); 5 a- O/ T5 ?- ?2 Y! y) ^( M4 | free(FormulaSym);* U2 r2 ~1 _( U8 I4 |+ U3 B return result; h7 y) X8 }* O9 z } $ g( Z) h" ]' o- c, ^// 计算算式结果" h& a) b G' m! o5 V+ l double GetFormulaVal(int *Num,int *Sym,int count) $ f7 Q! I5 }) F{" W- g6 `5 h8 S6 n S+ r int i,j; ) E5 O* K2 Z7 U double preresult; % ?% L- d* B ]$ J preresult = Num[0];. u/ z6 r" N% k6 P5 u i=1;j=0;& y6 c5 u* }* Z- s' {& g while(i) {1 X; x; |, [- f5 A. v$ X/ K { 1 u1 r6 M7 o9 P- N- w% @ switch(Sym[j]) : ]! d1 N V0 p { . K- n5 Q0 a9 j$ o case 1: - E$ a4 _$ ^! t% ^ preresult += Num; 0 S6 G* s( S+ {$ H break; 9 ^, ?4 N: K8 k9 s$ v" Y6 i y/ L case 2: ) n4 Z- U/ a* K; p preresult -= Num; 6 y# c6 l6 q( e% r% b break;) M$ ^& T" G: w3 P) Z9 G case 3: 7 C# V& D# s# M- m" R6 N: ]) u preresult *= Num;4 I2 ~+ i+ J" c y1 y break;2 e% b: S2 y5 V e; `/ h9 z4 F l" f/ X case 4:: @6 {( L. Q& ^' H; Q if(Num == 0) return -1000; 7 W6 u& n8 ^' L preresult /= Num; ; o# J' V+ Z! T. {7 N6 k1 N break; - y U1 L( F+ A9 z, C }$ V! T; j7 N0 w7 H i++;j++;3 E0 e( ^8 u& T u9 W }+ \- ^# k1 x7 G return preresult; //进行修正 9 f1 l5 w1 z' ^2 ?6 v; r5 u}" u$ k( j* C2 C // 打印算式2 s& p( M- Z% f" d" g' ^( J5 ` void ShowFormula(int *Num,int *Sym,int count,int sum)5 w7 v3 T$ G5 t2 d6 W {' V( P- j. A2 R2 C : e1 `( o, V* G* L) R" }0 u# w, V+ R int i,j,len;( P9 d! u) h6 u- S char *Formula = (char*)calloc(count*4,sizeof(char)); + p& j1 ^& t0 t. B6 T char temp[10]; 2 t* t' W; t6 f& H. x6 J' c; E1 F itoa(Num[0],Formula,10);8 B+ \- S9 G4 G: `1 M4 {) ^! K i=1;j=0; , [$ U; V* {; L$ ?. w while(i# y5 g4 o5 e6 k @! x {# V, u* Q0 W8 b, R itoa(Num,temp,10); & l: k, A: W: | len = strlen(Formula);% \% `; q- R+ G5 Z4 r3 f switch(Sym[j])- I( ]$ y6 c9 o4 y4 Z3 C$ d- \0 e/ Y {& v/ I% M) ], g1 W. `" K case 1: 3 ~, ]8 f3 k4 n% d case 2: * o! L4 }9 A ?* L Formula[len] = cSym[Sym[j]];$ R0 R& e8 O1 }2 x5 Z* C5 N6 S strcat(Formula,temp);5 C" _- E8 h! N F! ? R break; 7 C. l- P$ i8 @1 z4 n$ D case 3: + j8 u$ Q" B/ K7 O& Y; q+ J- W case 4: % U1 O0 y# o4 v( s' c7 P 4 l& w3 H( g8 } // 如果上一个操作符号优先级低于当前的,应加上括号 / Y O8 L6 r6 k A- t if(j==0 || Sym[j-1] > 2)! u4 I/ ^1 Y$ _9 M { U: X! o/ J3 q# K- G( S4 U( m# k7 a Formula[len] = cSym[Sym[j]];# e% A3 r' O- S6 c& k strcat(Formula,temp);8 G+ I# J* k0 h& C- [+ I, K }1 t) A/ v) X6 u* q. Z1 U5 E else ' N* `( h+ ]+ ^6 C {" c7 V v' B& H: G int n;# h- Z+ I2 A" Z; R& b; Z char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); ( Z9 U# e7 T1 Z% X, w2 S for(n=0;n! s- j" |1 N5 T+ j0 T. k5 y { 6 \ X' k H( J; g8 f FormulaTemp[n] = Formula[n];0 y) ^2 M/ R7 R7 s Formula[n] = 0;; W$ W3 d' v% S) ?" o. I- j } % N5 c/ e: e6 |6 c' P# k; y' o% T Formula[0] = '(';7 p: @1 o+ m0 S' g4 |) y strcat(Formula,FormulaTemp);, F" ?! ~3 K# w% A9 s/ Q free(FormulaTemp); 7 a1 N; o* u9 g# {* f8 @ Formula[len+1] =')';, E P1 t; G- ~$ t0 O$ f7 w8 Z Formula[len+2] = cSym[Sym[j]]; 4 |4 D1 f2 f. `, b- n2 j/ Z. K strcat(Formula,temp); ; i. Z0 z U* Q: C- w1 u) ?1 Q5 v } : l, S2 x$ O. v$ b* w1 _2 T# {" I break; 1 h y6 l. v$ c" S; F, m: J; I. j# M }9 J+ @2 |9 P1 _$ P i++;j++;. ]1 ~% V2 @0 m }2 b6 F( v! Q5 Q. _! \/ O printf("%s",Formula);1 W: l6 }4 w9 Q. v printf("=%d\n",sum); # J0 n! ?/ R7 s( m6 J; E- L8 K free(Formula); : C6 f# ] Z" H' |: ^6 p; V} * a; b* |" ~7 n v" Y/ M8 {7 Z" g# C // 以当前数组为基础得到一个从小到大排列的数组: w$ w* J5 c+ O ~! R" _6 K* F$ L // 返回非0表示穷举结束: t/ z+ x! c3 O q int EnumArray(int *Num,int min,int max,int count) " t' @: C$ P( f8 {6 a% _1 S{ 7 ?) R: V$ F5 r7 e0 f int i,top;5 o7 [# N4 B1 A2 M1 t top = count-1; ! p; ?% a- \- S& Z& e* \ Num[top]++;1 w( g9 d/ q% q, i5 J while(Num[top]>max-count+top+1 && top>=0)+ o; Q& @% q- f+ }* I- z6 k7 z5 j { . A: S% F" ~! w top--;6 ]: Q/ P+ M5 J8 L* J Num[top]++; ' v5 C! J9 N. X( N1 K. N# Z }; X7 L$ a% q% d# b2 \ for(i=top+1;i j- O1 o# s* q+ x: _ { - y( g5 u* M; B$ i Num = Num[i-1]+1;9 @! U& P; B0 Y; q" x) h4 [% ^ } " ?+ w `2 a) }/ R; x if(Num[count-1] > max) return 1; 2 j' K% B6 Z! {/ f7 A else return 0; $ d5 X! K4 ]: I} 7 O, v" n8 s& |* C; }7 u! }6 T+ c/ h // 不允许重复的初始化数组 9 \# A! M5 d5 q7 d l9 Bvoid InitArray(int *Num,int min,int max,int count) 8 {" U7 l/ Q% f$ o- l{5 F* v: i- [+ q( T7 v& u& z( J Y int i;2 a7 V1 U D8 Y, s1 N8 E for(i=0;i=min+i;5 N% b5 h1 c/ I! z Num[count-1]--;) ~8 J0 `3 `+ O) z; J+ W2 F% `/ s( } } ! i$ h; j* R- }5 d0 P % y/ e/ u3 u* Z( [2 F$ }2 E6 l4 a# ` 2 t. {+ p# {( O* l. p2 m0 `; |" T) Z R0 i2 a; W
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    ) D* n9 D' M8 H! B" C

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况' i& z& `# u. u- I; `

    * C) W. Q$ G5 {* g) e0 R如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:7 e9 B2 P% r, Z6 \0 h #include N# B/ t( [) ?: G: c) | #include 2 Y% o( ^- x8 I) ^ * P- [* v5 Y" o; @ Y int EnumFormula(int min,int max,int num,int sum); $ s: _; W- }. y0 f' U4 [- l! _* T void ShowFormula(int *Num,int *Sym,int count,int sum);$ X6 W% n) ?7 ?, }5 j/ [( V double GetFormulaVal(int *Num,int *Sym,int count); t3 o: z3 M" V8 ^# Q8 a int EnumArray(int *Num,int min,int max,int count); # n0 E; `0 }* A& }0 n1 j void InitArray(int *Num,int min,int max,int count);5 Q, n& y. q6 K% s1 ?; @# Q) T5 c const char cSym[5] = {0,'+','-','*','/'}; % X% u( j8 M& l7 _4 M' X8 z! G int main(int argc, char *argv[]); m& r; W: h" g' R6 i( e6 C9 `% Z { 6 T1 u1 W7 M( |; B3 E/ O2 S printf("总计%d个式子\n",EnumFormula(1,10,4,24));+ S1 V4 Y+ j9 W/ b# `% @5 B% y system("AUSE"); 3 ?8 b. D! t; c: M" b( b2 L; P return 0; % r( z# S- N/ d$ F% o4 }, W$ p& M }9 t8 p% m$ ]8 F) w , u2 h5 ~8 ]+ Y v5 c, W4 t N7 A int EnumFormula(int min,int max,int num,int sum) & b" M2 W$ ~. N$ N& K% l. w {1 D7 n, p* ]: C. j; a" C int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数9 O( z& g5 u+ N9 a* S //储存操作符号6 a1 Y( E( v5 D6 F) b //最后一位用于穷举结束标记 ( c( I$ q3 e% P3 a // 1 - 4 代表 '+' '-' '*' '/' % y; ?" c5 \0 G: o- p int *FormulaSym = (int*)calloc(num,sizeof(int)); O$ Q" O @1 R+ h3 r- B + g4 @$ \: t9 O/ B* { int result = 0; $ V5 g, t( F: Z" \0 k) S' y1 i$ v // 初始化操作数和操作符号数组 0 c* ~6 h4 q# \/ R % m" j; Z4 [* ?6 R J int i; " ?" \1 n# I4 k " d+ G0 k2 f- m9 u* E! z for(i=0;i = min;. M: p/ V4 |0 }9 O for(i=0;i = 1;8 l; {" q! E! l' X6 i FormulaNum[0]--; / M6 m6 _/ l1 w: F4 y) z, }* f! d# N0 q3 B* {$ @- i4 x InitArray(FormulaNum,min,max,num); - b# M2 }+ s! x. k- |' q FormulaNum[num-1]++; ( a! [4 H, F% v9 `% V) J // 穷举操作数和操作符号组合 & z f; @' S K h9 O+ Z while(FormulaSym[num-1] == 1) 6 C& E+ m F: o4 z( t/ B1 U2 u) \ { 1 z; |. u6 q( h2 A! K: O double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; 4 Y6 t4 c4 D. y0 i) e8 N if(t>-0.01 && t<0.01) " E1 w8 |# F" v# M {) m6 w" Q" k1 W( U& J //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], $ L; k9 J8 h4 S' Z N" Q9 j: }' F //FormulaNum[2],FormulaNum[3],5 U3 _5 l/ J; m. }6 N: s5 p // FormulaSym[0],FormulaSym[1], * f* b" p7 |/ B% w2 O // FormulaSym[2],FormulaSym[3]);- Z; M+ y* B3 Q2 f% K& D4 T* u3 ` ShowFormula(FormulaNum,FormulaSym,num,sum);2 D$ v1 j8 p9 e- L/ K result++;0 c# A! z4 S) N/ y } 9 i$ D# X, r% ] R+ x 2 A% ?0 N% v$ U( I9 S // 依次穷举操作数 ( O% ]. u4 N$ X4 z' S ; C, ]6 I/ Z6 \0 N //允许数字重复的穷举 5 w6 l8 g, x! [* z //FormulaNum[0]++; 2 b$ l0 \4 |5 E9 f, Q# ^, D4 ^: Y //for(i=0;FormulaNum > max && i 5 ^* I2 U9 `1 y O7 ]8 b //{ 0 Z [" d! e# g7 g f // FormulaNum = min;+ A7 x( J6 Q8 z0 \; S // FormulaNum[i+1]++;# _3 V1 K f- x4 ^ //}5 m1 }9 M4 z) I5 ?( ~) B* S- r. k // 操作数穷举与操作符号穷举联接 / \8 S5 e) ~! B( P4 R //if(FormulaNum[num-1] > max)$ p- l& a; Y) w- _+ f: M //{$ C9 C. ~( R0 M- d; R // FormulaNum[num-1] = min;! `5 `- e; s" E6 R. y // FormulaSym[0]++;' D* A3 e- X T, \$ [6 \ //} , Y9 Q R& u' y/ d & \! x+ a5 |1 O0 L5 g2 h // 不允许数字重复的穷举 9 e* r- N; X& x" P+ j( w4 w' R8 U6 ~ // 数字必须从小到大的排列,防止重复" H' w/ e( _0 q) w" [. b! e if((max - min)< num) exit(0); // 出错% A/ n( G) k" p; s' ]9 ^! `5 f 4 k& }8 E+ y( N if(EnumArray(FormulaNum,min,max,num)) 8 v' a; E2 l3 Q. ^* I; k( ~ {# G; Z8 Q. ^5 \9 Y3 g! | FormulaSym[0]++;( G, O8 v. }, t3 B* y& a InitArray(FormulaNum,min,max,num); 7 u/ _" r' K" B ]& E% ]) U7 ? FormulaNum[num-1]++;: S n8 T- }' W" h$ ]1 D6 A }- |3 Y; X9 m9 u7 H0 W! s 6 ?1 r; R6 u9 a G$ h1 x // 操作符号穷举 # X3 f' j7 w' o% T& G8 Q for(i=0;FormulaSym > 4 && i: k& Y6 B. |" o$ P2 g {/ u) ~/ S3 ]% E FormulaSym = 1; / F( a! L; [& T$ P2 q FormulaSym[i+1]++;0 j+ R& ?3 J; `6 r" ^ I } 8 l9 X1 k5 i3 s: f* U7 }& r1 B" b }+ b' B! P. m% ?$ | //释放空间 * N4 t8 O& \ z' \ free(FormulaNum); . t( Y* N; C$ S: p. e$ a free(FormulaSym);# y: T+ D5 N9 Z S0 t5 c return result; ! M5 n6 d* x# {, p( e& l }7 ?; Q$ `# l: y* }9 V3 |( d9 E // 计算算式结果 ' e4 u6 [& p0 R4 p$ w( l4 e; r double GetFormulaVal(int *Num,int *Sym,int count) 9 V7 h, z/ D& b* U u% W& y { + M ^* l" `9 Z6 ^6 B int i,j;8 T! y+ b- o' ^ double preresult; 0 {3 I' |0 P$ S preresult = Num[0]; ! r' U0 M6 k) X& e4 z8 `6 t i=1;j=0; . L2 X I( c* ?4 ^( l while(i8 b& \1 C0 z& O. Q3 s& d { 3 l9 J. @. l; m: b1 U& n$ a4 ~ switch(Sym[j]). D8 g6 K$ k' { {) `1 j1 J( J" m( Q( W$ U% O6 X case 1:# j8 v" {6 [9 t! {, R. z preresult += Num;' |: j( L" e* r* a- N break;# @# s+ H+ |" d: m case 2: : @" Z- ]7 }" \& P$ }) A preresult -= Num;$ [6 w2 R5 T |2 v6 B2 K break;. m8 J" M: r3 f) A: C- l case 3:- a9 @% c! J; a5 V preresult *= Num; 9 Q( L- h& D! {$ Z* z break; 2 j, R; v" I0 q; d case 4: , k3 f" T7 N7 j' Q }1 G6 q5 P if(Num == 0) return -1000;0 S6 ]3 L- E9 { preresult /= Num; ! M5 M9 \5 Q6 m5 _, Z2 f1 t break; + N/ k% c, @7 P } ( N, |: |6 X! R$ K0 k7 c i++;j++;, h1 r3 w- h9 d+ k7 b } 8 Y' M, H* ?" i# H" r% n" ? return preresult; //进行修正 ; o6 j' L8 {6 } p. e6 E" J8 b }( u, N* N" W% f! U6 X/ | // 打印算式$ j6 C/ R N2 k m% ^4 R! t2 d" J void ShowFormula(int *Num,int *Sym,int count,int sum)3 A( P8 t$ K" L { 2 o1 I- ~+ I8 F$ p6 i( Q* k. O- p* ~( S int i,j,len;" m# w& o& C* ^$ t# Y# i, |3 V" | char *Formula = (char*)calloc(count*4,sizeof(char)); 4 X7 G; f/ g8 p5 p! P4 [3 w7 q char temp[10]; 8 C+ l& a* J: S! h `7 G- w- I itoa(Num[0],Formula,10);& \! e% j* j7 q; ?! V i=1;j=0; : h' s6 W( m ` while(i6 Y9 K1 g4 o5 w0 ~" P7 [7 s1 J) O { ' v# P9 I3 ]) S8 K' z$ d3 a# j- Q2 m* F itoa(Num,temp,10); , B( o& L% g1 `4 C) w len = strlen(Formula); 3 n% C& S: y. h6 }& y7 J' I switch(Sym[j]) ( g* V* o( L, w! E) b, d" a" Y9 o {1 e( q2 a" X4 e) C. U( Y5 A+ d case 1:' W7 J5 W" J. U0 F. i; X; D case 2: / a1 l' R+ t* C1 ]& D/ V- @, M) N' i Formula[len] = cSym[Sym[j]];) X1 J8 s1 T' h- A; o+ n5 y/ Q strcat(Formula,temp); ! i) X( m' X4 } break; ) d! b" c% L4 o1 [/ x8 B case 3:' Y7 ^- k3 S+ [6 m; w case 4:. Y) G! i5 t2 x' v, X+ s, K" x' Z ( {: H' P; b: C1 }* M6 r+ u, L // 如果上一个操作符号优先级低于当前的,应加上括号9 |# l) @& K8 v; j6 D if(j==0 || Sym[j-1] > 2)0 c$ r4 a/ Q, l2 i3 H4 M% l { : y; m3 v* I3 Z Formula[len] = cSym[Sym[j]];9 c! |2 m2 g. w' e strcat(Formula,temp);/ ]2 |& F- L' U5 @+ r) r- q- F* O }4 Y7 |7 J p- O. t% k else5 [+ S7 |5 s; ^+ Q {: S- c; y/ K [0 A* v3 _ int n; / d$ k2 c+ ?$ Z. A char *FormulaTemp = (char*)calloc(len+1,sizeof(char)); 4 X3 M* C, H8 V T. F* H9 b5 s5 P for(n=0;n: z9 Z# y% G6 K0 u9 @: Z" m { 2 \7 N. A% \6 p FormulaTemp[n] = Formula[n]; 5 Q3 ]/ i; e7 h Formula[n] = 0;$ e) Q* s# r% [6 W* ~' l' e } 2 ]5 W# b2 P+ Y$ Q, G Formula[0] = '('; # G+ B2 ?' X+ W7 N' u; i0 }+ Z strcat(Formula,FormulaTemp); ! y& U3 F; J& K5 B) i0 M: N free(FormulaTemp);: P5 m6 L, T0 @9 ] Formula[len+1] =')';& |" D/ A4 u* q7 g$ ] Formula[len+2] = cSym[Sym[j]]; ' |0 \3 C3 R1 ^) @7 r" y5 r strcat(Formula,temp); 9 k) X& b7 Z% I+ f }. S9 M: p8 f1 z6 @ break; 9 Z8 A6 Z3 ]. {1 M( M: o( f+ B }! v# P2 \0 C/ O% d# u i++;j++; * z* h0 |2 I( b! x5 F/ f [ } - ^+ ^( _ L& W+ B) y' J/ t9 G printf("%s",Formula);* M* D& v1 w$ h) n& v$ i printf("=%d\n",sum);" N' \) W$ o/ H$ `* s9 B1 C- H' U free(Formula); + `- S2 E& w# ] C9 h+ U5 S; z }# a' m" Y* n; {6 p! U # [! g8 J9 \+ l: x" j9 V) p" |8 Y // 以当前数组为基础得到一个从小到大排列的数组 1 P$ K; {5 [/ F( a b/ T2 z // 返回非0表示穷举结束7 L! x- t2 {/ I. {. c1 A; c int EnumArray(int *Num,int min,int max,int count). x* i2 j$ R$ A$ F- r" _ d {. F8 N% X: T ~- `* a2 Y u' N int i,top;4 q- x/ l! L! ~0 b: m top = count-1;) v: ^: [% v' y( p: z: P2 v* e& c Num[top]++; h2 E# A. ?8 q& [6 ]0 @ while(Num[top]>max-count+top+1 && top>=0) {4 E3 O0 u( I! q9 v: @6 `& ~ {# j& g$ |* |, F- { top--; 2 l9 N( H" O# O/ f/ i. C3 G Num[top]++;5 w6 B% W; ]8 M% y } 1 W e( r. C1 q0 \ for(i=top+1;i- O# i7 k& h% e2 E/ l {& X* ~, w8 B& W0 M# f- ?! _ Num = Num[i-1]+1;' ?1 a0 a, X: Z7 } }& l4 U, O. i+ w9 B; I5 y- Y3 L {" ? if(Num[count-1] > max) return 1; 0 V {; e( }8 ]; c else return 0; . P& B2 |, {5 V6 S6 n. A0 r5 { } ! }, U1 h2 Y8 T, U ^, ~ % K6 F" x' U. O" A- q // 不允许重复的初始化数组* I0 s5 V9 c4 R8 T void InitArray(int *Num,int min,int max,int count) # L9 r, g9 ]- ~" p+ \ {/ ~& @) |# m5 o8 i$ r# U; ] int i; + ?0 I: m" i; `- ~8 q for(i=0;i=min+i; ' K1 o+ G* V; X Num[count-1]--; 9 {, O% `: k- k/ Z0 ^/ ?! W } " T3 U( q) c' S! [% P' K5 y8 Q6 [, f 4 M* u( u; R/ i+ r: z9 `2 q , A7 @! X* Z# _' H5 Y! \; R4 C/ s8 W * O9 S h& `7 G' ]$ z- K
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    " C# S% e0 f# Q2 I6 h 8 `. | s" f! Z! [# G5 {4 Qprintf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: 6 [ ]# _( d3 B% T1+4+9+10=24 , w' H0 N$ w4 B, v& \1+5+8+10=24 ( B9 z Y; ?8 u: J; f3 |! N1+6+7+10=242 } F& y9 ~6 v: e 1+6+8+9=24 * E( t6 ]$ \. K2+3+9+10=24 G! }* D: j9 h; |( p4 y 2+4+8+10=24 - }% K' Q6 B1 B/ i2+5+7+10=24 - ?$ `( x! @! H6 |, ]2+5+8+9=24 6 j: w* E# s- \( q" l9 y3 H2+6+7+9=245 }% z! \% O& }6 B' W; r/ D! s) S 3+4+7+10=24 - p% k) y8 O6 K1 g3+4+8+9=24- M+ j4 L- `; e+ h4 w' | 3+5+6+10=24/ s7 w5 A! |6 I5 }% T7 b8 @- T 3+5+7+9=245 t4 I6 L% J( i 3+6+7+8=24 : `. u- W! |! t) E- R0 W4+5+6+9=240 O" ~1 c' @% n 4+5+7+8=243 x B4 T' O' J& ]! _# v 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧?% K) P& L3 p5 \/ e 比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 5 {0 a% ?1 m) y6 Y- c* }3 X. B如: 1,5,7,8 有如下方法可以算出 24 2 F% j Y9 O- S# O+ Q3 _7 _((1+7)-5)*8 = 24 4 n' L! `7 E% y: Q/ T; Z# f((7+1)-5)*8 = 24, y2 K$ [$ R2 X (1+7)*(8-5) = 24$ S5 P, C7 C2 [+ w5 j3 h (7+1)*(8-5) = 24 4 c, [* u3 R' D1 y((1-5)+7)*8 = 24" u$ I0 g8 i! A L. {3 P ((7-5)+1)*8 = 24& X& R7 c. Z! Y% ` (8-5)*(1+7) = 24 ! H! M) r( t+ P; p `(8-5)*(7+1) = 24# Y; i, t8 a/ D9 I 8*(1+7-5) = 24 * K( D+ V8 v- Z" T! r0 }, ]1 z8*((1+7)-5) = 24. c, y6 S2 t1 X/ U3 Z 8*(1+(7-5)) = 24 8 M* p5 O* ~5 a( r. z$ X% T2 V8 i: @. r8*(7+1-5) = 24 ) J, n3 b1 m# F7 Q3 s7 e8*((7+1)-5) = 24 6 ~0 ?1 J/ y3 I% K8*(7+(1-5)) = 24" Q% d+ j+ Z9 t! b 8*(1-5+7) = 24 ) \" K0 c: q. E, M/ w7 Y% `8*((1-5)+7) = 24 / }. q! N$ j; ^" s5 b8*(7-5+1) = 24 4 g1 G3 y5 G; A' }' C8*((7-5)+1) = 24 % Q) Y V: E9 |5 y, c

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:( C' y) D% n7 Z) f2 X! ~  Z7 b
    1+4+9+10=24
    * l; I- S# Q# w, A4 w# x$ l! n1+5+8+10=24& B& r. ^7 W( C8 y2 ^5 |! C- u
    1+6+7+10=24& `2 |; C2 I' Q
    1+6+8+9=24
    7 {+ b7 o9 G7 X8 H1 _2+3+9+10=24
    ( e1 N' a  Q' O) J; X2+4+8+10=24
    " d" x, Q( L' ?4 x2 w4 @2+5+7+10=24  p* _  f8 L' E9 U8 y$ Q: h1 H
    2+5+8+9=240 T- }9 |4 y6 t8 h& k0 h
    2+6+7+9=24
    ' i. k* O  h7 S0 p  V# k3+4+7+10=24
    * w* b* a' _! D* k3+4+8+9=24+ ]$ h/ o9 }+ g# d
    3+5+6+10=24- G# m  y# E! l1 b
    3+5+7+9=24
    2 j1 C9 k2 ~7 _+ t/ w3+6+7+8=24
    , \' n2 M- i8 _6 l5 w+ t. U4+5+6+9=24
    & N2 H7 u% N5 ]& y4+5+7+8=24. X* C  J  h% N, b0 q% y
    1*5+9+10=24
    + q& E3 [, O0 `) R' U1*6+8+10=24
    3 D* i! o* u! H+ f& }5 c: G1*7+8+9=24+ o( t' j# H6 H; [+ M
    2*3+8+10=24
    1 ^/ Y. c+ g# S& W& ~+ O2*4+6+10=24
    % l7 G; N0 V7 A& n2 H/ W- t' Y& a2*4+7+9=247 x$ U, F# @) O; ^1 S# a9 s
    2*5+6+8=24, [* v( Y$ R6 X$ }) T
    3*4+5+7=24
    + z2 o2 y- h5 e4 s4*5-6+10=24
    . d( k5 J( F4 l% J(1+2)*5+9=246 b0 q4 N( n# h2 R
    (1+3)*4+8=24
    % y- e) I( Z3 k6 N, k5 |1*2*7+10=24, _, l5 y( t9 {% h4 X
    1*3*5+9=240 z* W, z) }; \( e6 ~3 J$ l7 c
    6*7-8-10=246 ?4 r  u' U$ h! _/ e' [
    (2+4)*5-6=24
      E) B+ [' A6 ~2*3*5-6=24# S* z( c5 Q' p( W) ?, L; K/ Y
    (1+2+3)*4=24
    4 J6 ]& y- i1 w5 T4 z2 {(1-2+4)*8=24% ?  H. u3 D* v; y7 E" t" I# I
    (1-2+5)*6=24' `& |7 |( W+ z  W' Q
    (1-3+5)*8=24  J( n. q, o/ I7 Y
    (1-4+6)*8=245 o# X: e2 \8 w2 @, ?5 N
    (1-5+7)*8=240 c5 T: P, K% E
    (2-3+4)*8=24
    + g0 z7 z; C9 d+ P. L(2-3+5)*6=24( F* w8 \6 m  R$ D. o3 i' e% j
    (2-4+5)*8=24& w# [% @* `9 s) V- Q! E! V% i
    (2-5+6)*8=24% Y4 D6 x0 u2 E8 q; J9 s
    (2-6+7)*8=24% x- L; A' g. p$ Y  s* D
    (3-4+5)*6=24" M4 y1 f# z3 K9 V: w; r! T. K( W/ c
    (4+5-6)*8=24
    9 U  z0 E# t4 Q# W0 d(4+6-7)*8=24
    4 i) P( B0 O8 Y5 \(2*4-5)*8=24
    0 i# G7 D1 k% R* @& R' M(2*5-7)*8=24+ d/ P0 j0 f. r" [
    1*2*3*4=24# d0 N+ ^, s/ q- Y
    1/2*6*8=24$ `- i: M" r8 W; G$ E
    1/3*8*9=24
    : B. j2 Z' C0 ?/ T# ~2/3*4*9=24+ M& a2 _& i1 C6 G% x) }9 Z
    2/4*6*8=242 }' g2 l( i% }+ O$ m4 b
    2/5*6*10=24
    ; F% w0 Z/ d" a) @, U2/6*8*9=244 S7 t. p+ c- `5 Y6 ?7 ?/ }
    3*4/5*10=24  p. z5 v/ B' }7 K1 O
    5*6*8/10=245 L9 T* O" e$ V0 M; Y# Z( E, s
    总计57个式子

    该用户从未签到

    14
    发表于 2004-5-2 15:22:00 | 只看该作者
    当然不会只考虑加法的情况,大概你复制的时候出现问题了,你可以下载这页最上面的那个程序- X& L, U6 H8 C5 ~) n- w: F2 }
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现( h! h, ~! s, X1 X) T* |0 I" e

    / V; N/ B$ B2 S1 c# `
      S* Y! j$ Q! @( t- J$ @% C  n+ a+ J

    : T: t% C: `- l3 n; w, t8 c) ?5 m8 i! J* f6 R8 d. b) a# x

    0 {" k# H2 t5 v8 A9 f" Y5 {% k
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]

    6 D% e* U& K/ G" Z0 Y
  • 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 | 只看该作者

    # r' \& }' s7 m. U4 k" n- ]0 u6 {0 b0 A* @7 a- h0 t- J
    用这个好了,只不过输入的时候要按从小到大
    / b( B2 F9 w) {6 J7 j5 x0 j5 P8 _6 }" u; \6 T7 g, ^
    好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:4 D5 g- s3 _! f) P5 h
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    4 ]& N: F1 v# b* o2 B. p' W. D
    4 `6 @3 b9 r. }: p9 n/ L5 @
    本来为了防止诸如
    ) B2 ]4 h* F' I8 W; o1*2*3*4
    & H2 K/ `) K2 x, s7 Z1*3*4*2
    % Y$ j0 X" k6 X5 Q# H" }+ b6 r2*3*4*1, w5 x$ U6 ~+ S5 B
    等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    . R  A9 n! H7 u/ \2 u& T0 |5 g$ t5 _! _+ H9 u
    另外你的程序就是有这些重复的
    . v! j' Q9 x4 b/ e5 N
    $ d% t! G  n9 t; |' b! e" K2 ]/ @PS:VB的程序感觉就是慢好多啊
    2 G8 J8 b& `) I5 o: ]& X2 {
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]

    6 m, h) L0 R, E: E/ E* c

    本版积分规则

    关闭

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

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