(ssl2875)2017年东莞市信息学特长生测试题 益智游戏

2017年东莞市信息学特长生测试题 益智游戏

Description

 李老师最近开发了一项关于训练学生心算能力的益智游戏,游戏很简单,就是随机给定4个1到9之间的自然数,要求判断能否对这4个自然数进行适当的算术运算,使运算结果等于24。
  你可以使用的运算只有:+,-,,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2(2/4)是不合法的)。下面我们给出一个游戏的具体例子:
  若给出的4个自然数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。计算过程:
  2+1=3
  7*3=21
  21+3=24
  不要求输出具体计算过程,现在请你编写实现这个游戏加强版的程序(所谓加强版,就是要对多组数据逐一进行判断,具体输入输出及要求如下)。

Input

共有N+1行,第一行只有一个正整数N,表示要判断数据共有N组(1=< N <=10),接下来N行,每行有4个1到9之间的自然数(数据与数据之间用空格隔开)。

Output

  共有N行,第K行对应于第K组4个1到9之间的自然数是否能用适当的算术运算使运算结果等于24,如果能,则输出1,如果不能则输出0。

Sample Input

2
1 2 3 7
1 1 1 1

Sample Output

1
0

Source

题解:

   本题是深搜;
   本题一开始也是想深搜,但不知道如何处理括号,便想到了暴力打公式(表)蒙分╮(╯▽╰)╭
   其实本题可以将输入的a[i]分别作为开头,去深搜5种计算过程(被人减和减去别人是两种操作哦!因为1个是正数,一个是负数嘛),并选用不同的数参与计算(不能重复),就可以不考虑括号啦!( ̄_, ̄ )
Why?

   因为有些括号使得某些数优先计算,那么你将这些数放在首位以后,那么这些情况也是不会被忽略的.

var
 a:array[1..4]of integer;
 v:array[0..4]of boolean;
 n,i,j:longint;
procedure try(sum,dep:integer);
var
 i:integer;
begin
 if dep=4 then begin if sum=24 then v[0]:=true end//如果计算完了4个数,且和是24就满足了
                         else
 begin
  for i:=1 to 4 do
   begin
    if not v[i] then//只要没被选用
     begin
      v[i]:=true;//被选用
      try(sum+a[i],dep+1);
      try(sum-a[i],dep+1);
      try(a[i]-sum,dep+1);
      try(sum*a[i],dep+1);
      if sum mod a[i]=0 then try(sum div a[i],dep+1);//要可以被整除哦
      v[i]:=false;//回溯
     end;
   end;
 end;
end;
begin
 read(n);
 for i:=1 to n do
  begin
   fillchar(v,sizeof(v),0);//四个都没被选用
   for j:=1 to 4 do read(a[j]);
   for j:=1 to 4 do try(a[j],1);//选取不同的数来做开头
   if v[0] then writeln(1)
           else writeln(0);
  end;
end.

猜你喜欢

转载自blog.csdn.net/ssl_lzx/article/details/80029799