题解 | 24点游戏算法

## 这题好难,先糊弄过去

package main

import (
	"fmt"
)

func cal(p0, p1, op float64) float64 {
	switch op {
	case 0:
		return p0 + p1
	case 1:
		return p0 - p1
	case 2:
		return p0 * p1
	case 3:
		return p0 / p1
	}

	return -1
}

func main() {
	var p0, p1, p2, p3 float64
	_, _ = fmt.Scan(&p0, &p1, &p2, &p3)
	// var p0, p1, p2, p3 float64 = 3, 9, 3, 4

	for _, params := range permute([]float64{p0, p1, p2, p3}, 0, 3) {
		for op0 := 0.0; op0 < 4; op0++ {
			for op1 := 0.0; op1 < 4; op1++ {
				for op2 := 0.0; op2 < 4; op2++ {
					// A (B C) D
					{
						result0 := cal(params[1], params[2], op0)
						result1 := cal(params[0], result0, op1)
						result := cal(result1, params[3], op2)

						if 24-result < 0.0001 && 24-result > -0.0001 {
							// fmt.Printf("params: %#v, ops: %v,%v,%v\n", params, op0, op1, op2)
							fmt.Println("true")
							return
						}
					}

					// A B (C D)
					{
						result0 := cal(params[0], params[1], op1)
						result1 := cal(params[2], params[3], op0)
						result := cal(result0, result1, op2)

						if 24-result < 0.0001 && 24-result > -0.0001 {
							// fmt.Printf("params: %#v, ops: %v,%v,%v\n", params, op0, op1, op2)
							fmt.Println("true")
							return
						}
					}

					// A B (C D)
					{
						result0 := cal(params[1], params[2], op0)
						result1 := cal(result0, params[3], op1)
						result := cal(params[0], result1, op2)

						if 24-result < 0.0001 && 24-result > -0.0001 {
							// fmt.Printf("params: %#v, ops: %v,%v,%v\n", params, op0, op1, op2)
							fmt.Println("true")
							return
						}
					}

					// A (B C D)
					{
						result0 := cal(params[1], params[2], op0)
						result1 := cal(result0, params[3], op1)
						result := cal(params[0], result1, op2)

						if 24-result < 0.0001 && 24-result > -0.0001 {
							// fmt.Printf("params: %#v, ops: %v,%v,%v\n", params, op0, op1, op2)
							fmt.Println("true")
							return
						}
					}

					// 6 / (1 - (3 / 4)) = 24
					{
						result0 := cal(params[2], params[3], op0)
						result1 := cal(params[1], result0, op1)
						result := cal(params[0], result1, op2)

						if 24-result < 0.0001 && 24-result > -0.0001 {
							// fmt.Printf("params: %#v, ops: %v,%v,%v\n", params, op0, op1, op2)
							fmt.Println("true")
							return
						}
					}
				}
			}
		}
	}

	fmt.Println("false")
}

func swap(arr []float64, i, j int) {
	tmp := arr[i]
	arr[i] = arr[j]
	arr[j] = tmp
}

func permute(params []float64, startIdx, endIdx int) [][]float64 {
	if startIdx == endIdx {
		// fmt.Printf("equal: %#v, i: %v\n", params, startIdx)
		return [][]float64{params}
	}

	result := [][]float64{}
	for i := startIdx; i <= endIdx; i++ {
		// fmt.Printf("params0: %#v, i: %v\n", params, i)
		swap(params, startIdx, i)
		copyedParams := append([]float64{}, params...)
		// fmt.Printf("params1: %#v\n", params)
		result = append(result, permute(copyedParams, startIdx+1, endIdx)...)
		swap(params, startIdx, i)
		// fmt.Printf("params2: %#v\n", params)
	}

	// fmt.Printf("result: %#v, i: %v\n", result, startIdx)

	return result
}

全部评论

相关推荐

WebSocket是一种在Web应用程序中实现实时双向通信的技术。它提供了一种持久连接,允许服务器与客户端之间进行双向数据传输。与传统的HTTP请求/响应模型不同,WebSocket允许服务器主动向客户端发送消息,而不需要客户端发起请求。要在Web应用程序中使用WebSocket进行实时通信,需要执行以下步骤:https://www.nowcoder.com/issue/tutorial?zhuanlanId=Mg58Em&amp;amp;uuid=b48bebe08e474db8b80b853b12bafd48#牛客AI配图神器#创建一个WebSocket对象:使用JavaScript的WebSocket构造函数创建一个WebSocket对象,指定要连接的服务器URL。例如:var&nbsp;socket&nbsp;=&nbsp;new&nbsp;WebSocket(&amp;quot;ws://example.com/socket-server&amp;quot;);监听WebSocket事件:使用WebSocket对象的事件监听器来处理WebSocket的各种事件,例如onopen、onmessage、onclose和onerror。这些事件将在WebSocket状态变化、接收到消息、关闭连接或发生错误时被触发。建立连接:一旦创建了WebSocket对象,通过调用其open()方法建立与服务器的WebSocket连接。当连接建立成功时,onopen事件将被触发。发送和接收消息:使用WebSocket对象的send()方法向服务器发送消息,消息可以是字符串或其他数据类型。服务器接收到消息后,可以使用WebSocket对象的onmessage事件来处理。关闭连接:当需要终止WebSocket连接时,可以调用WebSocket对象的close()方法。服务器会收到一个关闭请求,如果确定关闭连接,会发送一个关闭信号给客户端并触发onclose事件。通过使用WebSocket,Web应用程序可以实现实时的双向通信,适用于聊天应用、实时通知、实时更新和协同编辑等场景。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务