算法训练 24点游戏


第一版:蓝桥杯版(搜索算法)

后面会出力扣版的24点游戏的代码分析

1.问题描述

  1. 问题:

24点游戏是一个非常有意思的游戏,很流行,玩法很简单:给你4张牌,每张牌上有数字(其中A代表1,J代表11,Q代表12,K代表13),你可以利用数学中的加、减、乘、除以及括号想办法得到24。

  1. 举例:

((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);
					}
			}
	}
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值