描述
给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算。
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。
输入描述:
读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。
输出描述:
对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false
示例1
输入:
7 2 1 10
输出:
true
#include<cstdio>
bool isVisit[4];//用于去重
int arr[4];//存放4个数
bool DFS(int cur_index,int cur_sum,int target)
{
// 1.进入函数当前结点设置为已访问
isVisit[cur_index]=true;
// 2.已得到target,返回true
if(cur_sum == target)//可以得到target数字24
{
printf("true\n");
return true;
}
// 3.还没得到target,遍历邻居,
for(int i=0;i<4;i++)//对数字选取顺序无要求,所以遍历数组arr
{
if(isVisit[i]==false) //没有被访问过
{
// 4.进行递归,如果得到target数字24,返回true
if( DFS(i,cur_sum+arr[i],24)==true ||
DFS(i,cur_sum-arr[i],24)==true ||
DFS(i,cur_sum*arr[i],24)==true ||
DFS(i,cur_sum/arr[i],24)==true )//四种运算
{
return true;
}
}
}
// 5.得不到数字24,返回false
isVisit[cur_index]=false;//当前访问的结点恢复为未访问
return false;
}
int main()
{
// 1.读取4个整数
for(int i=0;i<4;i++)
{
scanf("%d",&arr[i]);
}
// 2.初始化isVisit
for(int i=0;i<4;i++)
{
isVisit[i]=false;
}
// 3.深度优先遍历求解
if(DFS(0, arr[0], 24)==false) //如果得不到24
{
printf("false\n");
}
}