下沙论坛

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

用新浪微博连接

一步搞定

QQ登录

QQ登录

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

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

[复制链接]

该用户从未签到

跳转到指定楼层
1
发表于 2004-4-27 17:53:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
就是扑克里的24点游戏,4个数,+-*/得24……
5 B# q2 x9 ]4 V0 N! Y0 m* _0 a( Y  G, 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的发言:' F- I1 Z  k6 C- g. d' W
    穷举法吧
    # k4 e$ y8 ^9 D* C. m
    那你的代码要写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 则表达试就是我们要求的了。比如:
    # w; @- C+ e* ^0 w. Z  s& [function GetMach(A,B,C,D) as String       '得到一个字符串组合如:(A+B*D)-C5 T/ ]! ?$ f8 E1 z% \
    function GetValue(MachString) as Float    '得到字符串的计算值 ,可能是小数
    3 J- }) L8 A* ]! G那么程序就好写了:
    $ g: m$ K5 B3 o. UGetNumber(&A,&B,&C,&D) ;    '得到ABCD则四个数字,赋给A,B,C,D四个变量
    2 [2 z8 n: k4 Y* p9 b* X" s+ `6 Bdo{
    & G' Y: ~7 R) _4 M0 }  MachString = GetMach(A,B,C,D); '得到一个表达试的字符传$ b* J7 p. o9 W5 Y+ x
      if(GetValue(MachString)==24) break;
    ! k' `- e! N- t& V0 |7 p$ f# {}
    5 Y0 \: e% D/ f. X. Y: \' v0 bprint XXXXXX;. C* K; S( n8 N

    该用户从未签到

    7
    发表于 2004-5-2 11:57:00 | 只看该作者
    我现在试着在写,就是不知道有什么好办法解决重复的算式问题,比如
    . F! F" S- Z) F(5-2)*8*1
    " [$ k8 t7 g3 N* N( B& y9 a0 k2 x9 w3 u- u
    (5-2)*1*8
    - Z" m1 d( I( Y  J& E' Q8*(5-2)*10 c6 e6 C/ T2 x- o
    等等
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    8
    发表于 2004-5-2 13:17:00 | 只看该作者
    $ Q% u: j/ x: B! f1 a% o

    : g/ ^- v4 c+ Z7 q5 Z" o9 M花了一个上午,终于完成了
    5 J  K* Z- n) u& l/ J6 O2 n/ [你参考参考吧,哈哈- o7 i) t' B3 w: ]; v/ Q

    7 a* d" o3 y" m1 [6 S. V$ b; z  D- w* Z' s+ H  m
    [此贴子已经被作者于2004-5-2 13:43:13编辑过]
    / F0 F& M$ L; F7 m
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    9
    发表于 2004-5-2 13:42:00 | 只看该作者
    上面的发现有一点bug,
    : v' A( {" ?( g, a, `: M6 q; [这个改过了- y" W/ f' T2 Z
    一个计算 24 点的小游戏
    % s( Y- ^2 L. U! c, uVB 编写
    , P! \; w  R, H9 L  u  Y
    & o! p3 K) @$ k* c, G' l! H
    : F  _- o  G4 ?: q" I8 l
    [此贴子已经被作者于2004-5-2 15:17:46编辑过]
    $ }# n: n! i0 f* T, _7 r6 G

    该用户从未签到

    10
    发表于 2004-5-2 14:41:00 | 只看该作者
    #include 4 V4 B8 R; P' l' \ #include . K2 i/ i1 m6 W7 V , T) I$ Z( ~! g# Gint EnumFormula(int min,int max,int num,int sum);; z& \3 z5 g; P) Q; ~2 R void ShowFormula(int *Num,int *Sym,int count,int sum); % A. t9 P" R8 c adouble GetFormulaVal(int *Num,int *Sym,int count); : v/ d: }) [6 j9 Uint EnumArray(int *Num,int min,int max,int count); 1 e& @8 r g pvoid InitArray(int *Num,int min,int max,int count); ; D! d i9 O( oconst char cSym[5] = {0,'+','-','*','/'}; - Z7 D7 S$ K; m9 _/ l8 G1 P; K7 b int main(int argc, char *argv[]) " r7 F( t8 \2 ?3 G{ $ ^ H3 T4 d: R6 `' W- W3 V: D! r printf("总计%d个式子\n",EnumFormula(1,10,4,24));+ T1 }& T6 d3 F! y system("PAUSE"); ' Y' m- E1 l4 s( o# Y5 B return 0; T) ?" g' x1 B1 z, M, e, C5 |} % s, k2 K6 L6 \ 2 {& H& i+ q: U; J$ b: M6 |( _int EnumFormula(int min,int max,int num,int sum): G- {, Q5 a8 R {! J5 h2 m0 E8 F' }# g int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数2 f8 k/ P8 g( X- k& f! I8 U //储存操作符号 8 o$ \& g5 B& M; d( {+ q+ ? //最后一位用于穷举结束标记7 ~3 @& b7 O! g) y1 H% w" K8 x // 1 - 4 代表 '+' '-' '*' '/'7 |2 Q/ S% \0 W! J1 T5 w' y int *FormulaSym = (int*)calloc(num,sizeof(int)); ( T' u; n* y6 h Y / s2 t6 \% P e8 r% ~ int result = 0; 9 o7 r# A8 s5 L b9 x! l$ u/ C- x // 初始化操作数和操作符号数组 7 w0 Q8 ^) ]+ D& p3 U S4 J ; ` C( G1 l" y3 i0 L2 j8 `$ P$ t int i;$ J/ j( Z+ S# L- i( z% \ 1 o! c8 F1 |% x( P" \ for(i=0;i = min;: I4 V( y/ T6 p for(i=0;i = 1;# h% {/ g) v8 T0 [8 V3 \+ ^ FormulaNum[0]--;5 c/ Z" D y$ I8 M) p m" e- ? " d1 b$ x Y: j4 I, i& s d* j InitArray(FormulaNum,min,max,num);/ y6 p3 Y$ P v2 U6 } FormulaNum[num-1]++;- K( r* B9 w# x* y! l- | // 穷举操作数和操作符号组合 8 ]3 y8 ]2 d, |8 e/ m4 K& c9 T( q while(FormulaSym[num-1] == 1) . T7 |7 q/ g: x# z {1 y7 I! s! T9 Y5 c+ o double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum; : m& g, [: Z& y& v6 B; h$ Y if(t>-0.01 && t<0.01) 3 [( ~* V8 m: h9 Z0 H { 7 P, R- Y, |, s4 q0 o //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1], , X7 `" ^) v, Y% h //FormulaNum[2],FormulaNum[3], , {3 E5 T1 [$ p8 [9 j, K; v/ D, k // FormulaSym[0],FormulaSym[1], ! ^2 ?* k+ V# T% W. x! ~# q2 w% m // FormulaSym[2],FormulaSym[3]); 7 u8 t" E9 L! b* {% J+ t& j ShowFormula(FormulaNum,FormulaSym,num,sum); 9 T) d1 o f- @ X" X result++;% N x9 l) A' s5 d7 w) T1 v$ d } i* o1 N7 e d! O9 ?0 O . k* y: w1 @; `3 G, k // 依次穷举操作数 & q E/ |$ Y* p" b0 s ( O- n0 E9 E! m+ h6 `% Z. ]( s //允许数字重复的穷举/ `- h: S, k1 [% U0 i T //FormulaNum[0]++; 0 ]" `: W5 \# a! C8 b //for(i=0;FormulaNum > max && i- k# F' A! L/ k+ ^1 V a6 |6 {6 r //{8 s6 d Z. Q, h, _; M$ Y% q // FormulaNum = min;" {- S0 o; G$ L" Z0 ? // FormulaNum[i+1]++; / `. N# C: R9 D% n //}5 j1 Q6 c+ k4 T: u; m // 操作数穷举与操作符号穷举联接 V7 x6 V6 S' c4 K# j/ V/ [5 r //if(FormulaNum[num-1] > max)) V4 P4 N/ y) W7 u //{ 5 w2 X8 W, p5 l: A1 l( \' W# C3 h/ j // FormulaNum[num-1] = min; ' X6 E3 i: ?. G) h" d5 U" x // FormulaSym[0]++;* D; f6 w8 D1 F1 Z; |+ z' | //}$ J; `1 m' ^: `$ N5 |; ], t6 C; c 0 P% P* C# e4 \8 }; m // 不允许数字重复的穷举 0 C6 i% a* ~' y# c // 数字必须从小到大的排列,防止重复 * r$ }" i* u6 B- X" N# S" f if((max - min)< num) exit(0); // 出错" r4 S/ @: W" W" Q8 ^ q0 _$ \0 f0 W0 x( _4 w# K if(EnumArray(FormulaNum,min,max,num))( I' W1 G9 n* ^# d( J { / }& ^: i2 Y) J) T$ p! O. ? FormulaSym[0]++; " O& m. u) I4 J4 B o' l/ d5 z InitArray(FormulaNum,min,max,num); 8 H' z- `* n4 ?( e$ p FormulaNum[num-1]++; 4 F- _% c$ U5 u5 I# S4 Z0 B9 @ } 4 T- d; u8 }! m, [5 D p 5 }; H* G* L- p; F4 e' u, T // 操作符号穷举 / e( v6 a- _$ J1 W7 u1 Y/ s; a for(i=0;FormulaSym > 4 && i* Z, H/ e- J y0 {" t { ; q% S2 X$ I9 z( E FormulaSym = 1; 4 f6 j' S# I) T# } FormulaSym[i+1]++;: h7 e0 R' W3 W8 r. W c2 j3 d0 S }! s2 Y7 y2 Z0 z% i) \ ) n3 M" j' o/ g$ n2 f. H. M }* J J+ G! u' I3 \ //释放空间6 H. _$ v7 [. c, R2 d& z free(FormulaNum); 0 y L; ]$ N; m- m- c free(FormulaSym);4 R5 l' S9 ?- i! m* o+ l1 y% t5 P2 J3 j return result;! Y/ Z0 L& v/ J }% h6 A" v$ p+ J+ T. q- B. Y // 计算算式结果! {3 j& N( r7 c+ ]+ k9 E ^; s9 ^# c: G- A double GetFormulaVal(int *Num,int *Sym,int count) " X( u7 Z# a8 U% o% }{ {3 ~. v+ Q( W6 i( }* T+ O int i,j;/ Y9 Y0 y' x) C# _1 M double preresult;4 s" L4 Q$ P3 }6 o preresult = Num[0];" H) @% x: ?) X5 i6 [; s i=1;j=0; 3 ^2 ?$ ~& Z# W+ _ while(i: S0 u0 }( M* `) j! H1 H% V { : Z- K! [+ E/ J) x5 T+ I0 ] switch(Sym[j]) - D2 I, J- D# m2 w {) _5 F! g1 ?( \$ }2 G0 y1 J5 y* R# I case 1: ; X. X. |0 P; q8 H/ N% r0 y2 m preresult += Num;. B2 H3 c+ v0 S! R break;3 U* e3 x5 U8 i* a case 2: v5 q& d5 S& U l) g preresult -= Num;8 \. }9 {1 U! u- y8 j& D* F9 j: O break;6 v% D) O8 l: h+ T case 3:! @: {1 P5 j7 {2 D: L1 O preresult *= Num; ; H9 ]7 p* C* X2 x6 F& b break;/ D* r: U6 L* t$ f1 ~ case 4:8 G! ]$ x! ]: d if(Num == 0) return -1000; P' \4 ~ Q0 J0 k5 [ preresult /= Num; 4 b" L: H- i/ N9 S& x+ k break;& }& U1 Y% x- \, ?% c( J } ' ^, y: z, ~% K& P; ]# N i++;j++; % F `0 t* f+ T- X* Q4 l } $ k5 p5 P/ v) L9 }$ s% H+ z) A return preresult; //进行修正6 {* q k [5 M% C" @1 e- I }. q6 s% U$ o; h) w, J" Q/ y // 打印算式 A. I3 a/ Z' ]# U; K* X% x" K; n void ShowFormula(int *Num,int *Sym,int count,int sum)4 U# j" E% b: ] { 0 i: {4 m/ o# B" u7 S- z( a + a3 G, @# R) \+ J, f; Z int i,j,len;* I# O; v/ e- j: z char *Formula = (char*)calloc(count*4,sizeof(char));9 N, C! T% i; m1 `4 V char temp[10];2 }8 I6 l" A2 ~5 G- y+ ^ itoa(Num[0],Formula,10);$ G. W7 S8 P- u+ u/ s i=1;j=0; 5 L, m6 I* W! V" F" q+ I& n3 R. m, ~ while(i% P8 ]: A7 v' m. l/ d3 _) q { + [; M2 F: {6 U& r3 G itoa(Num,temp,10); ! K) p: g2 O0 s% W len = strlen(Formula); . `. e5 r4 B/ x( M3 \2 M switch(Sym[j])4 W4 z1 |' D y! J) \+ R { 1 D9 [4 r/ a6 ]+ R% W6 Y. k3 k case 1:! t1 q9 I f1 ^* v% D0 c case 2:, I- L4 d" ~" b6 y Formula[len] = cSym[Sym[j]]; : _3 P! z% x( n) t1 s strcat(Formula,temp); m* k0 g* m0 {6 ^% C, y4 b break; ; a$ O# \% V# O/ s case 3:/ M' h$ v! ?' ~- X7 I- i) g% U case 4:. \$ d5 I8 @7 S( R) J$ X$ P5 z/ l" T . F; ~; v: i' c E6 d# X4 h3 Z // 如果上一个操作符号优先级低于当前的,应加上括号 1 B3 _1 ?1 u8 ] if(j==0 || Sym[j-1] > 2) G* _& \* a9 s; T {# ~6 I3 }& q: h% N) _% @ Formula[len] = cSym[Sym[j]]; : U8 |0 j( ~, B9 e0 B' Z strcat(Formula,temp);/ a& Y/ T) B' c, f! Y0 S o3 n }# v5 g5 @8 K1 q% C R else& t6 Z1 b' E A& h$ \" U* } {$ F' z# D, j8 A( Q int n;5 R+ y0 R# T5 v3 [# ? char *FormulaTemp = (char*)calloc(len+1,sizeof(char));% b" a1 P% L4 h2 n" A+ |* w8 z for(n=0;n Q5 [1 s. @% m9 ^- v% W { # k: U; s2 v. Z% \) k6 Q# K2 b FormulaTemp[n] = Formula[n];) E0 I3 Z( `1 g Formula[n] = 0;; k- k( G- _, F } g1 l* K; m/ T/ k8 { Formula[0] = '('; v& ^: r1 x* A' t) w strcat(Formula,FormulaTemp);5 W- M% s! \! c- A; z" @# _ free(FormulaTemp);* H0 g1 S! P- [% j Formula[len+1] =')';0 |7 y4 r: \4 u3 {2 q Formula[len+2] = cSym[Sym[j]];, q. Q" `) X" ~ P8 e strcat(Formula,temp);4 S3 z7 {* _, T2 w: U }1 ]1 V$ f* B4 _: a- M break; , Q y# W( B3 N8 n- t+ b } # _9 l5 B! n) _! Y8 b: D$ { i++;j++; 4 h8 U' p. e+ Q4 n3 }+ i4 @; n }+ B( w+ H; A$ @ printf("%s",Formula); ' w4 Z* l4 b$ W printf("=%d\n",sum); : g: Q) m$ c6 ~' { free(Formula);! Z7 Q: J! _& r- t: s } 0 m: p; A# G1 }' @! D$ g. f9 x3 B! p* X0 J/ ]7 O8 A1 {4 n7 M // 以当前数组为基础得到一个从小到大排列的数组5 W0 |7 m$ Q$ I5 Q" L" { // 返回非0表示穷举结束 / S; T7 O9 N* R F0 y9 Dint EnumArray(int *Num,int min,int max,int count) 7 m4 L: e4 y0 j# ~{! q! Y; d3 a, A( O( Z; b int i,top; 0 @+ |, W ]' j: o$ b top = count-1; 4 o/ F& A' ^7 S9 F' ^ Num[top]++; ; [: ]0 b% J, J- u& x9 ]# T6 a while(Num[top]>max-count+top+1 && top>=0)) `* S3 a1 U! U2 b7 H {: i8 P8 [0 E- p8 O9 ^1 f top--;4 j3 P9 s( |. t6 O% \7 J# s Num[top]++;; j: [4 W# M* j8 J } + _2 V( c- t2 b& W; b for(i=top+1;i1 }) o, E: C& f. Z- U0 Z {# o, l+ S H" A/ P5 |% V Num = Num[i-1]+1; ( d: u% k0 E7 i9 M9 ]# `- J } + I, `& g6 \0 Z1 z if(Num[count-1] > max) return 1;* R @; q: R4 ^. O; ?3 x) i- j else return 0;1 O# ?: o/ j! E. J) r, Z0 w- |+ Y4 U }* ~0 G, b+ x g. R% f, u $ @1 f3 k% T% f6 }// 不允许重复的初始化数组) s- M! |! ^# B9 o/ I void InitArray(int *Num,int min,int max,int count) ! G. K2 E6 M V5 V; R4 R) {{ 1 w; E. v$ N4 `6 v5 N int i;; z; \( O0 ^; h9 h3 \ h for(i=0;i=min+i; : p' u+ }) P. s p& Q- i: i Num[count-1]--;2 C" d' O- i& f& W7 }' d* a L } + B3 z: V6 W3 l6 Q7 Q. ^5 }0 u4 |' y$ u& P+ O E3 D1 } 4 L; W6 I9 S) n+ c' @* F + l# V6 f4 l U: y4 s * ^' s, s3 r4 g3 s
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    # F$ G% d' j& S( H

    该用户从未签到

    11
    发表于 2004-5-2 14:54:00 | 只看该作者
    本法穷举出所有用min - max之间的num个数组成算式,结果为sum的情况( a% A+ Y, Q/ [, n7 C

    - V6 ~; q6 K% Z* S" V如要具体的话,可以不穷举操作数,直接输入操作数,进行操作符号穷举
  • TA的每日心情
    奋斗
    2015-9-17 00:58
  • 签到天数: 1 天

    [LV.1]初来乍到

    12
    发表于 2004-5-2 15:17:00 | 只看该作者
    以下是引用游侠无极限在2004-5-2 14:41:26的发言:4 i/ M5 z8 O; j; q #include ' ]0 s1 I. b- l8 C #include - K, G7 G i2 U& D8 A0 w% [ . H0 J k7 E$ Y int EnumFormula(int min,int max,int num,int sum); [0 k2 Q( E+ d+ J void ShowFormula(int *Num,int *Sym,int count,int sum);* y) w# z4 |+ H3 S! b, D! y double GetFormulaVal(int *Num,int *Sym,int count); 0 Z+ h8 _" z* Z" I' _2 F" ^$ e7 O int EnumArray(int *Num,int min,int max,int count);$ N5 J( ~/ W/ I0 [" S void InitArray(int *Num,int min,int max,int count); 3 {6 o" m! ^% u1 a const char cSym[5] = {0,'+','-','*','/'}; ! H V, a- G; B4 t- W& ? |* t8 O6 g, |* T int main(int argc, char *argv[]). j1 H2 I7 ?/ a0 S; ~8 Z! E, _ {+ j/ b+ r1 A; F# ?. x$ d; Z printf("总计%d个式子\n",EnumFormula(1,10,4,24)); . Y0 ^) D1 Q3 B, N system("AUSE"); 3 [" ]. h4 t+ x. @ return 0; 9 C& D0 x9 X1 Y* C }* r+ [2 ?& X/ c( ~* F + H4 g/ ]8 h) j* R5 e int EnumFormula(int min,int max,int num,int sum) 8 G# e/ b2 a P+ a8 I. z {/ R! h5 A! n; ~+ |6 ^ i: e& C0 T int *FormulaNum = (int*)calloc(num,sizeof(int)); //储存操作数8 O: c3 z( i$ s O9 B& R6 E6 O1 m //储存操作符号+ ]% h5 o$ m0 C" @1 }) V$ H* A //最后一位用于穷举结束标记 & r! F& N$ ^$ U# k/ d' Z1 B; h // 1 - 4 代表 '+' '-' '*' '/'1 D! G4 ]) f0 \' c int *FormulaSym = (int*)calloc(num,sizeof(int));1 b3 @: ]9 B% o$ @$ \ g " [1 V/ z; y2 w2 L _4 Z- M( L int result = 0;, V" ^0 V3 k* t5 T& _. C j. J // 初始化操作数和操作符号数组" p# d2 I o* Q2 d, { ; D7 ^; @8 n, Y) o% P2 d int i;1 k1 \( \2 U$ n3 a2 i8 ? " b! J; ]# E z; ]0 [ for(i=0;i = min;6 L$ i7 ?' \: H for(i=0;i = 1;; d; o8 A2 W% V& u: C FormulaNum[0]--;( c x/ A8 y0 }3 Z; k5 Y0 Q ! ]3 ^* D/ p! d+ y! \, Y- v8 E, ` InitArray(FormulaNum,min,max,num);. d0 n: K& c( v0 b' n% a FormulaNum[num-1]++;" b2 Z4 O0 P0 z% K$ E // 穷举操作数和操作符号组合 3 I, I d$ f+ d, X& _ while(FormulaSym[num-1] == 1) " ^" K: }" j) N- Q6 Q! P% l { ' ]7 J& `8 r: k; K double t = GetFormulaVal(FormulaNum,FormulaSym,num) - sum;8 \; L8 H6 }) X/ i% [ if(t>-0.01 && t<0.01)( A' `2 U5 `( u2 ?3 v+ V* i {2 c3 ?+ ^( t+ M3 ? I" ]. B //printf("%d %d %d %d | %d %d %d ",FormulaNum[0],FormulaNum[1],4 l8 i3 i0 |4 N //FormulaNum[2],FormulaNum[3], & B4 W7 v1 {/ G9 F // FormulaSym[0],FormulaSym[1],, e8 M5 t& t7 k J8 V7 C // FormulaSym[2],FormulaSym[3]);; a0 [4 f. a0 M# h- g7 | ShowFormula(FormulaNum,FormulaSym,num,sum);1 e; ?0 B8 s: i6 W$ L+ |6 | W5 p result++; $ k+ Y( z8 z: ?' i$ V9 u& k }4 @; s8 t0 m' R7 A( z $ L, r! P A) t- x: V6 p // 依次穷举操作数 " c( m, x; T% h3 r" Y' p& ^# s / ^; [+ W9 w _1 h: ~) x //允许数字重复的穷举) J0 ]. n* ^* ~( M# G //FormulaNum[0]++;. Z. p' ?5 q, P4 d. R //for(i=0;FormulaNum > max && i S0 X7 Q0 r+ u# W, s //{5 c& D8 O' _8 D* X. P- K // FormulaNum = min; 0 L6 ]! M3 u/ O5 L // FormulaNum[i+1]++;0 t0 z: e/ ? y; l+ P //}& z, V. h0 q, B // 操作数穷举与操作符号穷举联接 7 J# s# _. r' L/ v% v6 ^ //if(FormulaNum[num-1] > max)! o8 v# U; r5 t/ N) }1 f w/ T //{ % r5 u. y/ z. h: Z // FormulaNum[num-1] = min; j- A+ q! e1 v) I+ I$ }+ p n; y. \ // FormulaSym[0]++;6 Z% v+ Z$ r, ^2 t0 `/ E //}4 c1 J* j7 M# \$ m7 D- v ; b; S: F$ ]/ y // 不允许数字重复的穷举+ |$ w8 K9 o) k1 ~ // 数字必须从小到大的排列,防止重复 + ^8 O/ S' H8 K* x8 i if((max - min)< num) exit(0); // 出错 ; X0 K' M, p* q6 A& \% K4 b1 @' M( N: @1 t if(EnumArray(FormulaNum,min,max,num)) ! K# ], V6 X" a3 c% W { 3 t( I9 l4 ?( W7 f FormulaSym[0]++; ) W( M8 F, B, \# o InitArray(FormulaNum,min,max,num); & D* U1 l7 z! O FormulaNum[num-1]++;+ {3 ~3 V* z5 t/ V$ A } 3 V! Z/ G% }/ G+ \ 8 y/ W+ N% u0 b1 v* C // 操作符号穷举# q9 U( M# q3 S# W2 H* j0 q! O1 X for(i=0;FormulaSym > 4 && i! A9 Y1 k& o: W { & ^ v% x D" b m8 W4 T FormulaSym = 1;. K0 x7 V. f* V1 ]6 U+ P8 E4 [" ] FormulaSym[i+1]++;( C5 s2 v" m# t: H C0 D! Z }3 ^; o# s% g- ]) a/ v) \ " G- @* B. B8 Y( ^/ k4 w }# C7 B' Y$ N/ y6 |" m //释放空间" G7 i: J. C k/ }- { free(FormulaNum);; S) C: m" ]! Z$ {0 t4 V free(FormulaSym); # p5 }( o$ K L+ T6 q6 Q return result; & A2 G4 ? m; Y! O' d# R } 9 \5 M# Z6 o1 X+ K4 B // 计算算式结果5 E% ?. Y" s% ~. i, P% a9 S double GetFormulaVal(int *Num,int *Sym,int count) 2 p. O3 P4 l: ~, Z: c7 I4 G { * W/ t% l5 b* W int i,j; & Q# D9 i Y/ M: T6 z4 n1 Q+ o double preresult; / i1 p# P+ e6 D2 s preresult = Num[0];7 z$ U" k! u- m- f( K9 @1 ~$ V i=1;j=0; % N: C3 K% ~3 Q2 u* a while(i9 z/ J7 y1 w4 V, A5 z( t/ Q; T {& _5 J" E( S" G" V switch(Sym[j]): d- R ~$ t1 c% X { $ U) |# Y% ^0 p8 ?2 Q case 1: R; {3 A" b- o( X4 S; k2 R4 x/ [ preresult += Num;$ i, q7 q8 V# o7 E% t3 r8 p1 a8 h, h break;0 \5 p$ X' G1 M2 i, u case 2: * O4 i }9 T2 O9 Z* J$ y preresult -= Num; / z7 H5 X; K; R" y- Z! ? break;% t+ E) B, z; ~8 Z5 W2 A4 Y( M case 3:/ E2 a/ ^) p- Z) f preresult *= Num; 8 o, z# C5 Y* G3 ] break;# t, B$ i. M6 W- X case 4:5 @; L5 g- f1 g' n8 J" G if(Num == 0) return -1000; , a2 R; B8 h2 t5 g/ t preresult /= Num;+ m' W h- N# e7 K% \1 |: D0 g( ? break;% }( o: Y) J( f( G9 _5 Y5 F. _ }/ l5 k' a+ T: y" t6 b( @& _3 p i++;j++; ) f7 B; i& e" X% q }2 C* s+ v. ?' K! c$ M return preresult; //进行修正 ' {: |" _. s& d5 a3 Y) h( c& L }9 c+ K: P2 `7 A // 打印算式 3 L* l& ]( \- h) i8 I7 @ void ShowFormula(int *Num,int *Sym,int count,int sum) 3 g. [) B5 b# S, q. o/ G. Y {$ l7 H( H6 L7 Y; J # c% O3 r! [2 L, }% U, g# G/ J; O int i,j,len; 2 Z3 M5 m% J+ e( w char *Formula = (char*)calloc(count*4,sizeof(char)); $ U5 Q+ W c: @8 }$ d char temp[10]; - N! R- y: U4 ]1 o: U* D& Y& d itoa(Num[0],Formula,10);" f( Z! ]( y$ \7 U9 y% J1 z i=1;j=0;6 S9 J' R2 z; K3 b: J. @ while(i, k% ]9 E/ k" W: b {; l' ~8 P+ {3 B) N itoa(Num,temp,10); ; Q9 T& D* q1 M# b len = strlen(Formula);' D$ M+ A7 [6 n$ R6 i+ f# V switch(Sym[j])3 ]& M9 _ v0 B5 _. E { 6 c& v1 }( n% N$ d/ d, z0 A case 1:" ?% k1 [3 ?/ y3 T8 y case 2:5 u3 Q4 m( ~5 @0 n" ~' v7 i, f Formula[len] = cSym[Sym[j]]; % k- n" L7 P, C$ P strcat(Formula,temp); * ]' N; O% y" K break; ( e0 m8 O8 m5 U: q' P case 3:# ~0 A5 W9 \, M/ q) Y Y! l case 4: 1 P( Y2 X# a7 p" [3 j) L: [ , ~6 {0 U4 ]/ V0 B2 b J // 如果上一个操作符号优先级低于当前的,应加上括号- L* x: Z7 ^: g: d5 A, r if(j==0 || Sym[j-1] > 2) " B6 ?( A+ s* d! K& \: N) j y { " _# O! X* Z, a' p1 q" Z Formula[len] = cSym[Sym[j]]; ( U3 O% ~3 e: d. h/ J! a+ g" V( Q strcat(Formula,temp); : k/ Y1 h2 ?6 ~8 ? } 1 H) q! u* C# { else9 o" x5 v& l+ N, o3 k( H9 {% U% j { : {6 V( K- ?3 J1 W1 A7 S5 \ int n;7 j3 w7 n5 z5 k1 k$ ^, W$ [ char *FormulaTemp = (char*)calloc(len+1,sizeof(char));& S& [& p$ z# c+ R2 C) | for(n=0;n; c. ]7 D6 X% ?9 `8 u {$ H/ {5 a" K. F3 h$ n% I; L FormulaTemp[n] = Formula[n]; ; M, c+ e- q9 a+ m( h" _ Formula[n] = 0;, _- N' A+ u0 W1 c E } $ y1 m! z# h, A! ]# I1 w7 h* i Formula[0] = '(';0 k/ t3 i2 G& g: s: Z strcat(Formula,FormulaTemp);2 E. u# a' o* o- o4 x* _3 q& h- A free(FormulaTemp); $ Y7 V7 r+ c; o# G- e4 j+ {3 I Formula[len+1] =')'; 7 l- b, A) b# A( g. p Formula[len+2] = cSym[Sym[j]]; , U8 ]0 R' [9 m, v strcat(Formula,temp); : X" u) p9 z6 @ }# _7 s O0 x; i# r break;/ |) R8 `, v% h5 u. O } # N& V6 j! ?1 J- y0 u) q5 { i++;j++; h3 L, O6 R/ M/ s } 8 n5 [" c7 O% |2 l printf("%s",Formula); 7 B' z$ ?( s) d* a" b printf("=%d\n",sum); 3 F: C$ d1 k# H y6 y! ^+ ?1 i free(Formula); 9 }7 _( E; V- }( X1 z1 i6 ^. |- V" _ } : `# X1 ]; ]' Y $ [+ b) }' Q/ _; E- T5 k: b // 以当前数组为基础得到一个从小到大排列的数组$ B a3 N8 U7 R6 _- u+ v6 T // 返回非0表示穷举结束 * J7 t% @) w! a, U- e/ x! e* @! [ int EnumArray(int *Num,int min,int max,int count) / N& g6 M7 d: N0 m7 s {: y8 ^3 D& e" L& F) R int i,top;/ e. B/ m8 x$ s* p8 v top = count-1; 9 O, F8 q k2 j7 X Num[top]++; 8 g4 ^5 H% z j; a+ ^: ] while(Num[top]>max-count+top+1 && top>=0)% X$ K+ _6 z: ~( h# u& \ {! d4 r$ r+ Y- Q+ r top--; 7 I( ^9 ~/ @& o0 L$ u Num[top]++; 9 N. g0 K% O/ X" n) k8 N } X$ d/ O C' W* Q- c/ w1 i for(i=top+1;i f2 H5 ]4 i8 f {; B; z" E9 B8 S- N Num = Num[i-1]+1;' E. h- `( J' g4 [% X } . x* n7 f- h' i0 ^9 T( E4 H if(Num[count-1] > max) return 1;' p! u7 S# N; o$ p else return 0;& x" C% I* A3 d/ f; D+ J8 x } ( u- v1 ^' D5 ^/ _/ z5 j. P1 I7 v' f! [ W: ^+ S# f // 不允许重复的初始化数组6 f4 J0 K, [% g* C; R7 C void InitArray(int *Num,int min,int max,int count)+ o/ m6 W+ {+ B; U { + Z9 C8 i3 z3 i3 Q" z: J int i; ! i: Z$ T% z3 ? H for(i=0;i=min+i; 9 c. \' q" K0 d: m$ Y& M0 a Num[count-1]--; 5 K# }! I3 }: T }% i2 ^7 V3 n6 Y 2 X6 G# j$ Y9 ~* ^5 b8 N. ]0 s& { ) ^" Y) D7 f' S2 A2 D( I 4 d6 |( R" S3 y1 \0 k ( i* G5 T8 ~+ r+ H; p- C
    [此贴子已经被作者于2004-5-2 14:50:47编辑过]
    , @( d, ?# O! I6 O5 e" o8 u( |0 M. ?7 ~2 P$ ? printf("总计%d个式子\n",EnumFormula(1,10,4,24)); 的运行结果是: ' P* Y( g" @* V- v2 J1+4+9+10=24 " ?3 x' i0 u! Q7 e1+5+8+10=24) S- q" j4 t7 [ O% K& ?: b- @! ~ 1+6+7+10=24# e1 P: g) X; T) G8 l9 l( D 1+6+8+9=24" h: G# a0 H, V: e- ], b 2+3+9+10=24( P7 r# \# D4 q1 Y* U 2+4+8+10=24 8 m" \. }& Z) C2+5+7+10=24 . p. N) O# l5 T- D# s, d3 l2+5+8+9=244 r! a' E' @" Y Z7 a5 U, X 2+6+7+9=24! T( \( ~' |8 h% X 3+4+7+10=24$ l. f( `- M& {( C8 h9 h 3+4+8+9=24& q$ ]* X, o$ t8 }. b' m6 p8 w Q 3+5+6+10=24 - Z( @+ F$ f' h4 R2 I F/ D3+5+7+9=24 ! k: q. P8 z0 ]) L" L3+6+7+8=24 1 M5 u3 k& o" \4+5+6+9=24, D o5 D3 L" X) M$ n 4+5+7+8=24& i) U$ e" B2 r 这是什么意思?似乎是找出了 1 至 10 之间的和是24 的数据,这和完成计算24点,差很多吧? - }* E5 d$ K( s/ X9 Z比如用户输入 2 ,5,7,8 程序应该能得到计算这四个数据得到24的表达式才行啊,这样就可以写一个游戏了。 1 }* d% }7 T2 f" N: f5 d3 A如: 1,5,7,8 有如下方法可以算出 24 " I, X6 v$ R& d9 Y8 q' {7 b((1+7)-5)*8 = 24 ( W# b6 K" j# ~# P1 C4 z& A6 s1 ]& @((7+1)-5)*8 = 242 g4 `0 I; C# ?. B5 k (1+7)*(8-5) = 24% n) `, S$ \: G8 m) }+ `& w3 R: \ (7+1)*(8-5) = 24: w7 T1 ~7 S; s3 u( i9 N6 R) @ ((1-5)+7)*8 = 240 ]& A8 A, t) R6 I( B ((7-5)+1)*8 = 24( ]+ f- m$ t& E6 @) P4 ] (8-5)*(1+7) = 240 Q4 z- o! S& F( j4 U# A7 N | (8-5)*(7+1) = 24 0 G- U' ?( _) _" f8 b8 K/ n( }& N8*(1+7-5) = 243 U+ `6 L' G" r @7 l 8*((1+7)-5) = 24 ; h/ T8 U* x# J0 S8*(1+(7-5)) = 240 j& i. l1 C: g- X) Y- L/ Z 8*(7+1-5) = 24 $ m) Z( t7 ~: j( I8*((7+1)-5) = 24 & Y6 l9 y7 G# h X4 G+ S& Y& f8*(7+(1-5)) = 24 / U. V; G- f: h* \& b: |8*(1-5+7) = 243 M: i0 F' Z* z! B 8*((1-5)+7) = 24/ y7 H- S" Z+ ~4 K! B/ m7 R' G 8*(7-5+1) = 24) M9 {! q7 \6 p0 b 8*((7-5)+1) = 24 1 w1 d9 w4 S& |$ h2 d1 r5 _

    该用户从未签到

    13
    发表于 2004-5-2 15:21:00 | 只看该作者
    结果是这样的:
    9 T+ d- k6 d- b. h6 @1+4+9+10=24+ ]: V' T1 |  b3 a% O# v
    1+5+8+10=24  Q) Z- |3 l2 D
    1+6+7+10=24
    ; Z2 B5 \  S7 i6 x1+6+8+9=24% s( J1 u- z: k# v( `, n
    2+3+9+10=24
    * e6 Q" J- T% X/ U, C* v2+4+8+10=24
    / J) k6 r5 U* Y: ~$ ~2+5+7+10=247 C- v* `3 h! m6 T7 W
    2+5+8+9=24
    9 m; {) h! d- r  o2+6+7+9=24
    % e" f$ j5 }, m- U( s3+4+7+10=24: n& A& N/ Q+ W! J0 m
    3+4+8+9=24
    ' P8 {$ p! L  T, U- k9 I3+5+6+10=248 E9 L; P" m& l  E+ b8 C
    3+5+7+9=24
    1 h( r: R  t; l6 k3+6+7+8=24
    5 F7 T( _! M  N$ U  b, X, J/ T4+5+6+9=24; ]' M9 F( m9 q# I* `
    4+5+7+8=24( ~/ z/ V/ C$ {
    1*5+9+10=24
    - w- h6 `: {( B# V- E1*6+8+10=24
    8 R, w. {! b" Z4 ^1*7+8+9=245 C% N; O) m/ E) x
    2*3+8+10=243 Q2 u6 @: B+ M
    2*4+6+10=24
    ( R( U% i3 l4 [  \2 b" r" U! y2*4+7+9=24
    7 l7 l! V7 Y3 h" K9 t; M7 D2*5+6+8=24" `, h2 M9 W* `  F0 f& R* L
    3*4+5+7=24
    * c+ K) ]+ ~) K: U0 z4*5-6+10=24+ d3 z0 s( g" [" l4 p
    (1+2)*5+9=24
    ; T, U0 M8 b2 [(1+3)*4+8=24% y( s7 s. U7 U* x8 _
    1*2*7+10=242 ~" T3 ~5 F+ W# F" L* x: A
    1*3*5+9=24& J- ^3 d- _* b. A* M: y) w
    6*7-8-10=24
    & M% a8 N. P2 ?5 S(2+4)*5-6=24) z& |+ N; u, \  |  h4 l
    2*3*5-6=24% ?' w; {6 {9 [- E7 P- w( y( _
    (1+2+3)*4=247 [$ n! b" e$ o5 f4 X, _. U
    (1-2+4)*8=24/ |- e$ E5 A. B7 S" x( |7 U# s
    (1-2+5)*6=24
    , G2 ]' |/ c$ f- V, u& L# R(1-3+5)*8=248 M: S0 w5 i! N* ]' p. l
    (1-4+6)*8=24
    1 D$ g5 y" O! p/ y/ E(1-5+7)*8=244 \- T% `2 J# W3 O9 J6 j& g
    (2-3+4)*8=24
      w* b4 Z# j0 J  ]; R( S(2-3+5)*6=24
    # R: u" C, i; E; o, M$ I  I(2-4+5)*8=24. a3 F# K4 i! e" `; s0 U
    (2-5+6)*8=24
    ' x7 j1 A. u- e8 W8 `2 I3 m) r(2-6+7)*8=24
    % T+ ^. E0 X" [' F+ N) v0 j(3-4+5)*6=24' Q0 \$ E* r- B; m
    (4+5-6)*8=24
    ! N+ M, R' Q7 R( W" z, s& \& _(4+6-7)*8=241 G; W: a0 ~' T) N: T
    (2*4-5)*8=246 k: e8 k9 F! h4 |  L8 N
    (2*5-7)*8=24. ]" s: b) `1 a. [: [7 |+ d  Y
    1*2*3*4=24
    * G: O* }+ K' w1/2*6*8=24
    6 s$ k* E8 {) C5 q5 l' J! J3 @# D1/3*8*9=244 n3 w2 d) G) l1 q) ~
    2/3*4*9=24- M0 Y. f# C$ b5 Y* K& J! e0 D
    2/4*6*8=24) V. x  e0 o& M9 [1 G6 s( ^- x& S+ Z- y
    2/5*6*10=24% i% c1 ?9 |" J! k1 o. \5 v
    2/6*8*9=247 V4 ^& y# e6 L- b
    3*4/5*10=24
    / X( ?- h2 N8 {% l$ ~  l8 P5*6*8/10=24
    4 W3 F( g4 g* ?; _7 ~7 `1 G+ P+ f总计57个式子

    该用户从未签到

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

    [LV.1]初来乍到

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

    [LV.1]初来乍到

    16
    发表于 2004-5-2 15:28:00 | 只看该作者
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现
    * z! y% q) [1 i; T7 P3 I3 V9 s- X8 b. x
    # }& ]( Y! Q; c5 Q- E! N
    ) o# z, v& }# [3 n) e) i; ?
    * @/ Y* v! Z2 L$ v
    % e  ?  G: J* `4 I/ q

    * }; q" h: q9 v2 T+ J8 d2 f$ t/ j
    [此贴子已经被作者于2004-5-2 15:32:12编辑过]
    4 s2 H- [4 T( R# k
  • 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 | 只看该作者
    7 ]1 I- m( w1 I

    & [* x( h7 `/ m用这个好了,只不过输入的时候要按从小到大0 `& a& H7 L1 a0 F( }# a

    + Z' T2 G3 s5 A# m4 ^  Z6 L好象有BUG,我暂时不太清楚

    该用户从未签到

    20
    发表于 2004-5-2 15:38:00 | 只看该作者
    以下是引用yzhlinux在2004-5-2 15:28:15的发言:3 ~. o5 z' x! g% L! \2 Q8 S
    (2-1)*3*8 这个算式你就没有啊,这4个数字的组合都没有出现

    , ^5 L  |0 q5 D0 b+ O8 x: w8 h# m
    ) y" ]% |* x) _+ V1 R7 n本来为了防止诸如
    ; Y: x8 y! N; v; S' Z0 _1*2*3*4
    6 d8 @, {' ^& v5 a* d2 M: ?1 q1*3*4*2
    ; m) p% @! \6 g* h2*3*4*1
    0 q* X% Y+ y: O) q  Q- @( V/ L" O等的重复,只使用了从小到大的数组,不过这样好象也丢了不少可行的式子
    3 d3 x; m' {- U$ z; \" a, Y6 e
    + Z3 {+ x/ [+ Z( j. h7 @. i4 z另外你的程序就是有这些重复的) Z' z! ]" e/ [3 ~

    ! D$ V5 A4 z- J5 R; Q4 S6 gPS:VB的程序感觉就是慢好多啊
    . F" [; }- {+ K5 t9 R
    [此贴子已经被作者于2004-5-2 15:42:01编辑过]
    4 H+ J; q$ ^1 m8 f  C, L+ ?

    本版积分规则

    关闭

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

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