java题目HJ67 24点游戏算法

描述

给出4个1-10的数字,通过加减乘除运算,得到数字为24就算胜利,除法指实数除法运算,运算符仅允许出现在两个数字之间,本题对数字选取顺序无要求,但每个数字仅允许使用一次,且需考虑括号运算
此题允许数字重复,如3 3 4 4为合法输入,此输入一共有两个3,但是每个数字只允许使用一次,则运算过程中两个3都被选取并进行对应的计算操作。

输入描述:

读入4个[1,10]的整数,数字允许重复,测试用例保证无异常数字。

输出描述:

对于每组案例,输出一行表示能否得到24点,能输出true,不能输出false

示例1

输入:
7 2 1 10
输出:
true

 

 

 1 import java.util.*;
 2 import java.io.*;
 3 public class Main{
 4     static int[] nums = new int[4];  // 存放输入数字
 5     static boolean[] visit = new boolean[4]; // 存放对应位置数字是否使用标志
 6     static int flag = 0;
 7     
 8     public static void main(String[] args){
 9         Scanner sc = new Scanner(System.in);
10         while(sc.hasNext() && flag ==0){
11             String[] input = sc.nextLine().split(" ");
12             for(int i = 0; i < 4; i ++)
13                 nums[i] = Integer.parseInt(input[i]);
14             dfs(0, 0);   
15             System.out.println( flag == 1 );
16         }
17     }
18 
19     // tmp是前面n个数字运算结果,u表示已经使用了多少个数字
20     public static boolean dfs(int u, float tmp) {
21         //递归出口,数字已用完且结果为24
22         if(u == 4 && tmp ==24) {
23             flag = 1;
24             return true;
25         }
26         
27         // 对四个数字递归
28         for(int i = 0; i < 4; i++) {
29             if(visit[i]  == false) { // 当前数字标志位是:未使用
30                 visit[i] = true;  // 更新为已使用
31                 if(dfs(u+1, tmp + nums[i]) ||
32                    dfs(u+1, tmp - nums[i]) ||
33                    dfs(u+1, tmp * nums[i]) ||
34                    dfs(u+1, tmp / nums[i])) {
35                     return true;
36                 }
37                 // 相当于回溯
38                 visit[i] = false;
39             }
40         }
41         return false;
42     }
43 }

 

posted @ 2022-03-13 15:08  海漠  阅读(297)  评论(0编辑  收藏  举报