poj3983(牛人啊)

View Code
//POJ 3983 第二届顶嵌杯决赛A题 计算4个数等于24//搜索 数据较小,不用剪枝就过了
//利用类似层叠那样,每运算一次,就合并两个数,所以少一个数,每次计算的值都保存在curVal中
//注意浮点数1/3 *3 会等于1
//格式化输出时用到sprintf,挺不错的
#include<stdio.h>
#include
<string.h>
#include
<math.h>
#define bool int
int option[5];
int order[5];
float number[5];
float curVal[4][5];
//输出时用到的临时变量
char outputStr[15];
char outputStr2[15];
char tempStr[15];
char tempStr2[15];

bool bfs(int k)
{
int m;
if(k==3)
{
if(fabs(24.0-curVal[3][0])==0)
return 1;
else
return 0;
}
else
{
int i,j;
for(i=0;i<3-k;i++)
{

for(j=0;j<4;j++)
{
switch(j)
{
case 0:
curVal[k
+1][i]=curVal[k][i]+curVal[k][i+1];
break;
case 1:
curVal[k
+1][i]=curVal[k][i]-curVal[k][i+1];
break;
case 2:
curVal[k
+1][i]=curVal[k][i]*curVal[k][i+1];
break;
case 3:
curVal[k
+1][i]=curVal[k][i]/curVal[k][i+1];
break;
}
for(m=0;m<i;m++)
curVal[k
+1][m]=curVal[k][m];
for(m=i+1;m<3-k;m++)
curVal[k
+1][m]=curVal[k][m+1];
option[k]
=j;

order[k]
=i;
if(bfs(k+1))
return 1;
}
}
}
return 0;
}
void OutPut(){
if(order[1]>=order[0])
order[
1]++;
order[
2]=3-order[0]-order[1];

char op[4]={'+','-','*','/'};
sprintf(outputStr,
"(%d%c%d)",(int)number[order[0]],op[ option[0] ],(int)number[order[0]+1]);
strcpy(tempStr,outputStr);
if(abs(order[0]-order[1])==2)
{
sprintf(outputStr2,
"(%d%c%d)",(int)number[order[1]],op[ option[1] ],(int)number[order[1]+1]);
strcpy(tempStr2,outputStr2);

if(order[0]<order[1])
sprintf(outputStr,
"%.*s%c%.*s",sizeof(tempStr),tempStr,op[ option[2] ],sizeof(tempStr2),tempStr2);
else
sprintf(outputStr,
"%.*s%c%.*s",sizeof(tempStr2),tempStr2,op[ option[2] ],sizeof(tempStr),tempStr);
}
else
{
if(order[0]<order[1])
sprintf(outputStr,
"(%.*s%c%d)",sizeof(tempStr),tempStr,op[ option[1] ],(int)number[order[1]+1]);
else
sprintf(outputStr,"(%d%c%.*s)",(int)number[order[1]],op[ option[1] ],sizeof(tempStr),tempStr);
strcpy(tempStr,outputStr);
if(order[2]==2)
sprintf(outputStr,"%.*s%c%d",sizeof(tempStr),tempStr,op[ option[2] ],(int)number[order[2]+1]);
else
sprintf(outputStr,"%d%c%.*s",(int)number[order[2]],op[ option[2] ],sizeof(tempStr),tempStr); }
printf(
"%s\n",outputStr);
}
int main()
{
int i;
for(i=0;i<4;i++)
{
scanf("%f",&number[i]);
curVal[0][i]=number[i];
}
bfs(
0);
OutPut();
return 0;
}
http://www.cnblogs.com/VRS_technology/archive/2010/12/04/1896383.html
posted @ 2011-03-04 16:33  聊聊IT那些事  阅读(680)  评论(0编辑  收藏  举报