闲的无聊写的程序~没有做过什么优化,而且加法乘法的交换性也没有考虑进去
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define PLU 0
#define MIN 1
#define MUL 2
#define DIV 3
#define RES 24
#define ERR -30000 //不可能达到的值,在13^4之外,28651
#define SUCC 1
const char opChar[4]={'+','-','*','/'};
const int numA[24][4]={
0,1,2,3,
0,1,3,2,
0,2,1,3,
0,2,3,1,
0,3,1,2,
0,3,2,1,
1,0,2,3,
1,0,3,2,
1,2,0,3,
1,2,3,0,
1,3,0,2,
1,3,2,0,
2,0,1,3,
2,0,3,1,
2,1,0,3,
2,1,3,0,
2,3,0,1,
2,3,1,0,
3,0,1,2,
3,0,2,1,
3,1,0,2,
3,1,2,0,
3,2,0,1,
3,2,1,0
};
int calT(int t1,int t2,int op){
if ((t1==ERR)||(t2==ERR)) return ERR;
switch(op){
case PLU:return t1+t2;
case MIN:return t1-t2;
case MUL:return t1*t2;
case DIV:
if ((t2!=0)&&((t1/t2)*t2==t1))
return t1/t2;
else return ERR;
default:
return ERR;
}
}
int calTurn(int *num,int* oper){
int result;
result=calT(calT(calT(num[0],num[1],oper[0]),num[2],oper[1]),num[3],oper[2]);
if (result==RES) {printf("Anser is ((%d%c%d)%c%d)%c%d=24\n",num[0],opChar[oper[0]],num[1],opChar[oper[1]],num[2],opChar[oper[2]],num[3]);return SUCC;}
result=calT(calT(num[0],calT(num[1],num[2],oper[0]),oper[1]),num[3],oper[2]);
if (result==RES) {printf("Anser is (%d%c(%d%c%d))%c%d=24\n",num[0],opChar[oper[1]],num[1],opChar[oper[0]],num[2],opChar[oper[2]],num[3]);return SUCC;}
result=calT(calT(num[0],num[1],oper[0]),calT(num[2],num[3],oper[1]),oper[2]);
if (result==RES) {printf("Anser is (%d%c%d)%c(%d%c%d)=24\n",num[0],opChar[oper[0]],num[1],opChar[oper[2]],num[2],opChar[oper[1]],num[3]);return SUCC;}
result=calT(num[0],calT(calT(num[1],num[2],oper[0]),num[3],oper[1]),oper[2]);
if (result==RES) {printf("Anser is %d%c((%d%c%d)%c%d)=24\n",num[0],opChar[oper[2]],num[1],opChar[oper[0]],num[2],opChar[oper[1]],num[3]);return SUCC;}
result=calT(num[0],calT(num[1],calT(num[2],num[3],oper[0]),oper[1]),oper[2]);
if (result==RES) {printf("Anser is %d%c(%d%c(%d%c%d))=24\n",num[0],opChar[oper[2]],num[1],opChar[oper[1]],num[2],opChar[oper[0]],num[3]);return SUCC;}
return 0;
}
int solution(int *numBufTemp){
int q=0;
int numBuf[4];
int opBuf[3];
q=0;
for (q=0;q<=23;q++){
numBuf[0]=numBufTemp[numA[q][0]];
numBuf[1]=numBufTemp[numA[q][1]];
numBuf[2]=numBufTemp[numA[q][2]];
numBuf[3]=numBufTemp[numA[q][3]];
for (opBuf[0]=0;opBuf[0]<=3;opBuf[0]++){
for (opBuf[1]=0;opBuf[1]<=3;opBuf[1]++){
for (opBuf[2]=0;opBuf[2]<=3;opBuf[2]++){
if (calTurn(numBuf,opBuf)==SUCC) return 1;
}
}
}
}
printf("No answer!\n");
return 0;
}
int main(int argc,char *argv[]){
int i;
time_t t;
int num[4];
char ch;
srand((unsigned) time(&t));
// randomize();
while(ch!='e'){
for (i=0;i<=3;i++){
num[i]=rand()%13+1;
printf("%d ",num[i]);
}
printf("\n");
ch=getch();
solution(num);
ch=getch();
}
}
转载请注明出处,禁止用于任何商业用途,否则后果自负!