速算游戏_NOI导刊2011提高(04)
这道题会做到怀疑人生,好了废话不多说,我们发现这道题是一道深搜。但是字典序却不知道怎么排,我们发现没算一个运算符就会填加一个括号,所以我们用一个char变量贮储字典序最小的东西。
代码:
#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; }
.....