C語言實現24點遊戲原始碼
阿新 • • 發佈:2020-01-07
本文例項為大家分享了C語言實現24點遊戲的具體程式碼,供大家參考,具體內容如下
參考文章:C語言實現經典24點演算法
將演算法實現改成C語言,並可在linux伺服器上執行。同時修改為可顯示所有結果。
注:如果傳參重複,如4,4,7,7這樣,會回顯重複結果,暫無法清除。
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> const double PRECISION = 1E-6; #define COUNT 4 const int RESULT = 24; #define STRLEN 50 double number[COUNT] = {0}; //這裡一定要用double,char expression[COUNT][STRLEN] = {0}; //儲存表示式 #define TRUE 1 #define FALSE 0 int cnt = 0; void Test(int n) { int i = 0; int j = 0; int len = 0; //遞迴結束 if(1 == n){ if(number[0] == RESULT) { // 避免輸出前後括號 for (i = 1; i < strlen(expression[0]) - 1; i++) { printf("%c",expression[0][i]); } printf("\n"); cnt++; return; } else return; } //遞迴過程 for(i=0;i<n;i++){ for(j=i+1;j<n;j++){ double a,b; char expa[STRLEN] = {0}; char expb[STRLEN] = {0}; a=number[i]; b=number[j]; // 刪除number[j]元素,用number[n-1]填補 number[j]=number[n-1]; strcpy(expa,expression[i]); strcpy(expb,expression[j]); // 刪除expression[j]元素,用expression[n-1]填補 strcpy(expression[j],expression[n-1]); // 加法 len= strlen(expression[i]); snprintf(expression[i],STRLEN,"(%s+%s)",expa,expb); number[i]=a+b; Test(n-1); //減號有兩種情況,a-b與b-a len= strlen(expression[i]); snprintf(expression[i],"(%s-%s)",expb); number[i]=a-b; Test(n-1); if(a != b) { len= strlen(expression[i]); snprintf(expression[i],expb,expa); number[i]=b-a; Test(n-1); } // 乘法 len= strlen(expression[i]); snprintf(expression[i],"(%s*%s)",expb); number[i]=a*b; Test(n-1); //除法也有兩種情況,a/b與b/a if(b!=0){ len= strlen(expression[i]); snprintf(expression[i],"(%s/%s)",expb); number[i]=a/b; Test(n-1); } if((a!=0) && (a != b)){ len= strlen(expression[i]); snprintf(expression[i],expa); number[i]=b/a; Test(n-1); } //恢復陣列 number[i]=a; number[j]=b; strcpy(expression[i],expa); strcpy(expression[j],expb); } } return; } int main(int argc,char **argv) { int i = 0; if(5 != argc) { printf("arg err\n"); return 0; } for(i=0;i<COUNT;i++) { char buffer[20]; number[i] = atoi(argv[i + 1]); strcpy(expression[i],argv[i + 1]); } Test(COUNT); if(0 != cnt) { printf("Total[%d],Success\n",cnt); } else { printf("Fail\n"); } return 0; }
執行結果如下:
andy@ubuntu14:~/work$ ./test 5 6 7 8 ((5+7)-8)*6 (5+7)*(8-6) 8/((7-5)/6) (6/(7-5))*8 6/((7-5)/8) (8/(7-5))*6 (6*8)/(7-5) ((5-8)+7)*6 (7-(8-5))*6 (5+7)*(8-6) (6*8)/(7-5) (5+(7-8))*6 (5-(8-7))*6 Total[13],Success andy@ubuntu14:~/work$ ./test 7 7 7 7 Fail
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。