|
|
发表于 2004-12-10 10:35:19
|
显示全部楼层
我以前写过一个算5个5的24点算法,临时写的,输入输出不是很规范
输出4次计算所用的算符和计算的位置(总共计算4次,在4个位置上),给楼主做参考
- #include <stdio.h>
- #include <stdlib.h>
- /*
- * 5个5算24点
- * main函数中生成所有计算顺序的排列组合
- * check函数计算该组合是否可以得到24
- * c: 放原操作数,并保存计算结果
- * d: 标记是否计算过
- * a: 操作符
- * b: 计算顺序
- */
- void check( int a[4], int b[4] ) /* a: operator, b:sequence */
- {
- int i, j, k;
- float c[5];
- float t1, t2;
- int d[5];
- char ch;
- for( i=0;i<5;i++ ) {
- c[i]=5;
- d[i]=-1;
- }
- for( i=0;i<4;i++ ) {
- k = b[i];
- j = k;
- while(d[j]!=-1) j=d[j];
- t1 = c[j];
- j = k+1;
- while(d[j]!=-1) j=d[j];
- t2 = c[j];
- switch(a[k]) {
- case 0:
- t1 = t1+t2;
- break;
- case 1:
- t1 = t1-t2;
- break;
- case 2:
- t1 = t1*t2;
- break;
- case 3:
- t1 = t1/t2;
- break;
- }
- d[k+1] = k;
- j = k;
- while(d[j]!=-1) j=d[j];
- c[j] = t1;
- }
- if( c[0]>=23.99 && c[0]<=24.01 ) {
- for( i=0;i<4;i++ ) {
- switch( a[i] ) {
- case 0: ch = '+'; break;
- case 1: ch = '-'; break;
- case 2: ch = '*'; break;
- case 3: ch = '/'; break;
- }
- printf("%c,", ch);
- }
- printf(" -- ");
- for( i=0;i<4;i++ ) printf("%d,", b[i]+1);
- printf("\n");
- }
- }
- void main()
- {
- int a[4], b[4];
- int c[24][4];
- int i,j,k;
- int t;
- int flag;
- int mask;
- int e[4] = { 2,2,1,3 };
- int f[4] = { 0,1,2,3 };
- k=0;
- for( j=0;j<=0xff;j++ ) {
- flag = 0;
- for( i=0, mask=3;i<=3;i++,mask<<=2 ) {
- t = (j&mask)>>(i*2);
- b[i] = t;
- a[i] = 0;
- }
- for( i=0;i<4;i++ ) {
- if( a[b[i]]==1 ) flag=1;
- a[b[i]]=1;
- }
- if( flag==0 ) {
- for( i=0;i<4;i++ ) {
- c[k][i] = b[i];
- }
- k++;
- }
- }
- for( j=0;j<=0xff;j++ ) {
- for( i=0, mask=3;i<=3;i++,mask<<=2 ) {
- t = (j&mask)>>(i*2);
- a[i] = t;
- }
- for( i=0;i<24;i++ ) check(a, c[i]);
- }
- }
复制代码 |
|