第一版:蓝桥杯版(搜索算法)
后面会出力扣版的24点游戏的代码分析
1.问题描述
- 问题:
24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24。
- 举例:
((A*K)-J)Q等价于((113)-11)*12=24
加减乘不用多说了,但除法必须满足能整除才能除!这样有一些是得不到24点的,所以这里只要求求出不超过24的最大值。
2.输入格式
输入第一行N(1<=N<=5)表示有N组测试数据。每组测试数据输入4行,每行一个整数(1到13)表示牌值。
3.输出格式
每组测试数据输出一个整数,表示所能得到的最大的不超过24的值。
4.分析
2022/4/15 补
5.代码
import java.util.Scanner;
public class Main {
static int n,vis[],arr[],max,pos;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
int[][] num = new int[n][4];
vis = new int[4];
arr = new int[4];
for(int i = 0;i < n ;i++)
for(int j = 0;j < 4;j++)
num[i][j] = sc.nextInt();
for(int i = 0;i < n;i++)
{
max = 0;
Dfs(1,num[i]);
System.out.println(max);
}
}
static int VF(int a,int b,int h)
{
switch(h)
{
case 1:return a+b;
case 2:return a-b;
case 3:return a*b;
}
if(b == 0) return 1000;
if(a % b != 0) return 1000;
return a/b;
}
static void Dfs(int step,int[] num) {
for(int i = 0;i < 4;i++)
{
if(vis[i] == 0)
{
vis[i] = 1;
arr[pos++] = num[i];
Dfs(step+1,num);
vis[i] = 0;
arr[--pos] = 0;
}
}
if(step > 4)
{
for(int i = 1;i <= 4; i++)
for(int j = 1;j <= 4;j++)
for(int k = 1;k <= 4;k++)
{
int tp1,tp2,tp3;
tp1 = VF(arr[0],arr[1],i);
tp2 = VF(tp1,arr[2],j);
tp3 = VF(tp2,arr[3],k);
if(tp3 <= 24) max = Math.max(max, tp3);
tp1 = VF(arr[1],arr[2],j);
tp2 = VF(arr[0],tp1,i);
tp3 = VF(tp2,arr[3],k);
if(tp3 <= 24) max = Math.max(max, tp3);
tp1 = VF(arr[1],arr[2],j);
tp2 = VF(tp1,arr[3],k);
tp3 = VF(arr[0],tp2,i);
if(tp3 <= 24) max = Math.max(max, tp3);
tp1 = VF(arr[0],arr[1],i);
tp2 = VF(arr[2],arr[3],k);
tp3 = VF(tp1,tp2,j);
if(tp3 <= 24) max = Math.max(max, tp3);
tp1 = VF(arr[2],arr[3],k);
tp2 = VF(arr[1],tp1,j);
tp3 = VF(arr[0],tp2,i);
if(tp3 <= 24) max = Math.max(max, tp3);
}
}
}
}