C語言版的算24游戲代碼

jopen 9年前發布 | 1K 次閱讀 C/C++

給定4個1-9之間的數,通過加減乘除四則運算算出24來,可以使用括號

#include "stdafx.h"

include <stdio.h>

include <stdlib.h>

double sum(double a,double b) { return a+b; } double mi(double a,double b) { return a-b; } double mul(double a,double b) { return a*b; } double di(double a,double b) { return a/b; }

double (*ops[4])(double a,double b)={sum,mi,mul,di};

double num[4];/輸入的數/ double num3[4];/第二次運算時暫時保存/ double num4[4];/第一次運算時暫時保存/ double numf[4];/輸入的數保存輸出時候用/

/復制數組/ void copyarr(double src,double des) { int i; double t[4]; for(i=0;i<4;i++) des[i]=src[i]; }

/第一次計算后,合并為前三個數/ void reorder4(int cp4,double re4) { switch(cp4) { case 0: num[0]=re4; num[1]=num[2]; num[2]=num[3]; break; case 1: num[1]=re4; num[2]=num[3]; break; case 2: num[2]=re4; break;

}

}

/第二次計算后,合并為兩個數/ void reorder3(int cp3,double re3) { switch(cp3) { case 0: num[0]=re3; num[1]=num[2]; break; case 1: num[1]=re3; break;

}

}

/根據運算得到操作符/ char opc(double(opt)(double a,double b)) { if(opt==sum) return '+'; else if(opt==mi) return '-'; else if(opt==mul) return ''; else if(opt==di) return '/';

}

/輸出/ void printresult(double num,int ta3,int ta4,double(op2)(double a,double b),double(op3)(double a,double b),double(op4)(double a,double b)) { double n0=num[0]; double n1=num[1]; double n2=num[2]; double n3=num[3];

switch(ta4)
{
case 0:
    if(ta3==0)
        printf("((%.0f%c%.0f)%c%.0f)%c%.0f\n",n0,opc(op4),n1,opc(op3),n2,opc(op2),n3);
    else if(ta3==1)
        printf("(%.0f%c%.0f)%c(%.0f%c%.0f)\n",n0,opc(op4),n1,opc(op2),n2,opc(op3),n3);
    break;
case 1:
    if(ta3==0)
        printf("(%.0f%c(%.0f%c%.0f))%c%.0f\n",n0,opc(op3),n1,opc(op4),n2,opc(op2),n3);
    else if(ta3==1)
        printf("%.0f%c((%.0f%c%.0f)%c%.0f)\n",n0,opc(op2),n1,opc(op4),n2,opc(op3),n3);
    break;
case 2:
    if(ta3==0)
        printf("(%.0f%c%.0f)%c(%.0f%c%.0f)\n",n0,opc(op3),n1,opc(op2),n2,opc(op4),n3);
    else if(ta3==1)
        printf("%.0f%c(%.0f%c(%.0f%c%.0f))\n",n0,opc(op2),n1,opc(op3),n2,opc(op4),n3);
    break;
}

}

int main(void) { int a,b,c,d;/輸入的數/ int cp3,cp4;/cp3,cp4分別是第二次和第一次運算時的兩個數運算,前一個數所在的位置/ int i,j,k;/循環各種運算/ double re2,re3,re4;/第3,2,1次運算的結果/ double(cop2)(double a,double b);/第3次操作符/ double(cop3)(double a,double b);/第2次操作符/ double(cop4)(double a,double b);/第1次操作符*/

scanf("%d%d%d%d",&a,&b,&c,&d);

num[0]=(double)a;
num[1]=(double)b;
num[2]=(double)c;
num[3]=(double)d;

/*每次運算之前備份,運算后合并以供后面的運算,但是如果沒有找到解必須恢復備份*/
copyarr(num,numf);
copyarr(num,num4);

for(cp4=0;cp4<=2;cp4++)
{
    for(i=0;i<4;i++)
    {
        cop4=ops[i];
        re4=(*cop4)(num[cp4],num[cp4+1]);
        reorder4(cp4,re4);
        copyarr(num,num3);
        for(cp3=0;cp3<=1;cp3++)
        {
            for(j=0;j<4;j++)
            {
                cop3=ops[j];
                re3=(*cop3)(num[cp3],num[cp3+1]);
                reorder3(cp3,re3);

                for(k=0;k<4;k++)
                {
                    cop2=ops[k];
                    re2=(*cop2)(num[0],num[1]);
                    if(re2==24)
                    {
                        printresult(numf,cp3,cp4,cop2,cop3,cop4);
                        system("pause");
                        return 0;
                    }
                }
                copyarr(num3,num);
            }
        }
        copyarr(num4,num);
    }
}

system("pause");
return 0;

}</pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!