這道題會作到懷疑人生,好了廢話很少說,咱們發現這道題是一道深搜。可是字典序殊不知道怎麼排,咱們發現沒算一個運算符就會填加一個括號,因此咱們用一個char變量貯儲字典序最小的東西。數組
代碼:code
#include<cstring> #include<cstdio> typedef char String[20]; int a[4],b[4], ans[4][2]; String x[4],m,mina="zzzzz"; char op[4],data[4]; void print() { for(int i=0;i<4;i++) { sprintf(x[i],"%c",data[i]);//將原來數組記錄一下 } for(int i=0;i<3;i++) { sprintf(m,"(%s%c%s)",x[ans[i][0]],op[i],x[ans[i][1]]);//去找字典序最小的值 strcpy(x[ans[i][0]],m);//複製粘貼 } if(strcmp(mina,x[ans[2][0]])>0) { strcpy(mina,x[ans[2][0]]);//比較 } } void dfs(int k) { if(k==3) { int i; for(i=0;i<4;i++) if(a[i]!= 0) break;//將a[i]數組的值存到a[3]裏,方便判斷 if(i<4&&a[i]==24) { print(); } return; } for(int i=0;i<4;i++) { for(int j=0;j<4;j++) { if(i!=j&&a[j]!=0&&a[i]!=0) { int t1,t2; //加操做 t1=a[i],t2=a[j]; a[i]=a[i]+a[j];a[j]=0; ans[k][0]=i,ans[k][1]=j;//記錄本次的加數 op[k]='+';//記錄符號 dfs(k+1);//再搜一遍 a[i]=t1,a[j]=t2; //減操做 t1=a[i]; t2=a[j]; a[i]=a[i]-a[j]; a[j]=0; ans[k][0]=i; ans[k][1]=j; op[k]='-';//記錄 dfs(k+1); a[i]=t1; a[j]=t2; //乘 t1=a[i]; t2=a[j]; a[i]=a[i]*a[j]; a[j]=0; ans[k][0]=i; ans[k][1]=j; op[k]='*'; dfs(k+1); a[i]=t1; a[j]=t2; //判斷會不會出現小數 if(a[i]%a[j]==0) { t1=a[i]; t2=a[j]; a[i]=a[i]/a[j]; a[j]=0; ans[k][0]=i; ans[k][1]=j; op[k]='/'; dfs(k+1); a[i]=t1; a[j]=t2; } } } } } int main() { char hh; memset(ans,-1,sizeof(ans)); for(int i=0;i<4;i++) { scanf("%c ", &hh);//我覺得會出現A,T,J,Q,K。 data[i]=hh; if(hh=='A') a[i]=1; else if(hh=='T') a[i]=10; else if(hh=='J') a[i]=11; else if(hh=='Q') a[i]=12; else if(hh=='K') a[i]=13; else { a[i]=hh-'0'; } } memcpy(b,a,sizeof(a));//其實能夠刪掉。 dfs(0);//搜素 printf("%s\n", mina);//輸出 return 0; }
.....blog