NKOJ P1388 算24点(10.15.2017)

来源:互联网 发布:windows7 iso for mac 编辑:程序博客网 时间:2024/06/07 20:39

题目导引:http://oi.nks.edu.cn/zh/Problem/Details/1388

问题描述

几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算24点”。您作为游戏者将得到4个1~9之间的自然数作为操作数,而您的任务是对这4个操作数进行适当的算术运算,要求运算结果等于24。 

您可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子: 

若给出的4个操作数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。 


输入格式

只有一行,四个1到9之间的自然数。

输出格式

如果有解的话,只要输出"yes"

如果没有解则输出“No answer!” 


样例输入

1 2 3 7

样例输出

yes

输出说明:
2+1=3
7*3=21
21+3=24














楼主最开始看到这道题的时候也写了一跳,觉得这道题有点恐怖,毕竟24点运算+-*/要分级运算,但是后来想了想,其实也就是一道dfs的裸题,注意还原现场,基本上就是一道裸题。

题目比较简单,如果题目稍微难一点还可以将符合条件的运算按照一定条件输出,这个处理表达式就会更加麻烦一些。

废话不多说,直接上代码:

#include int Num[5];bool Mark=0,Used[5];//mark表示是否能得到24并且恰好用完4个数字;used[i]表示第i张卡片是否使用; void DFS(int alr,int Sum)//alr表示已经讨论到第alr个数;Sum表示前alr个数的运行结果 ; {if(Mark==1)return;//如果mark为1表示已得到答案,结束所有搜索; else{if(alr==4&&Sum==24)//判断是否得到答案 {    Mark=1;return;//得到答案并结束当前搜索 }for(int i=1;i<=4;i++)if(Used[i]==0)//Used[i]==0表示第i张卡片没有使用,进行搜索 {Used[i]=1;//使用第i张卡片 DFS(alr+1,Sum+Num[i]);//搜索 DFS(alr+1,Sum-Num[i]);//搜索 DFS(alr+1,Sum*Num[i]);//搜索 if(Sum%Num[i]==0) DFS(alr+1,Sum/Num[i]);//先判断是否能被整除,例如7/3不符合规则 Used[i]=0;//还原 }}}int main(){for(int i=1;i<=4;i++) scanf("%d",&Num[i]);for(int i=1;i<=4;i++) DFS(1,Num[i]);//搜索 if(Mark==1)printf("yes");else printf("No answer!");return 0; }

原创粉丝点击