24点回溯法实现

本文介绍了如何使用回溯法来解决经典的24点游戏。通过将四张牌的组合运算转化为递归问题,结合浮点数计算,实现了找到所有可能的解法。涉及的编程知识点包括回溯策略、浮点数处理以及用户输入处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// test11.cpp : Defines the entry point for the console application.
//


#include "stdafx.h"
#include "iostream"
using namespace std;
int i=0;
void back(float a,float b,float c,float d,int j);
void add(float a,float b,float c,float d,int j)   
{
if ((a*b!=0)&&(j<4)&&(i!=1))
{
back(a+b,c,d,0,j+1);
if (i==1)
cout<<(a+b)<<"="<<a<<"+"<<b<<endl;
}
}


void sub(float a,float b,float c,float d,int j)  
{
if ((a*b!=0)&&(j<4)&&(i!=1))
{
back(a-b,c,d,0,j+1);
back(b-a,c,d,0,j+1);
if (i==1)
cout<<(a-b)<<"="<<a<<"-"<<b<<endl;
}
}


void mul(float a,float b,float c,float d,int j)
{
if ((a*b!=0)&&(j<4)&&(i!=1))
{
back(a*b,c,d,0,j+1);
if (i==1)
cout<<(a*b)<<"="<<a<<"*"<<b<<endl;
}
}


void divi(float a,float b,float c,float d,int j)
{
if ((a*b!=0)&&(j<4)&&(i!=1))
{
back(a/b,c,d,0,j+1);
if (i==1)
cout<<(a/b)<<"="<<a<<"/"<<b<<endl;
}
}


void back(float a,float b,float c,float d,int j) 
{
add(a,b,c,d,j);
mul(a,b,c,d,j);
sub(a,d,b,c,j);
divi(a,d,b,c,j);
add(a,c,b,d,j);
mul(a,c,b,d,j);
add(a,d,c,b,j);
mul(a,d,c,b,j);
sub(a,b,c,d,j);
divi(a,b,c,d,j);
sub(b,a,c,d,j);
divi(b,a,c,d,j);
sub(d,a,b,c,j);
divi(d,a,b,c,j);
sub(a,c,b,d,j);
divi(a,c,b,d,j);
if ((j==3)&&(a+b+c+d==24))   
i=1;
}
void main()
{
float a,b,c,d;
printf("input 4 num\n");
scanf("%f%f%f%f",&a,&b,&c,&d);
if (i==0) back(a,b,c,d,0);
//if (i==0) back(b,a,c,d,0);
//if (i==0) back(c,b,a,d,0);
//if (i==0) back(d,a,b,c,0);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值