Swift暴力求解 4个数字n1, n2, n3, n4对应24种排列组合; 4个字符对应24种排列组合,外加4种都是同一个符号的组合,共28种组合; 遍历这24种组合顺序的数字与28种组合的符号,进行计算直接求解。
while let str = readLine() {
if str.lowercased().contains("joker") {
print("ERROR")
} else {
let array = str.components(separatedBy: " ")
let map = ["A": 1, "2": 2, "3": 3, "4" : 4, "5": 5, "6": 6, "7": 7, "8": 8, "9": 9, "10": 10, "J": 11, "Q": 12, "K": 13]
var opsArray = [[String]]()
opsArray.append(["+", "-", "*", "/"])
opsArray.append(["+", "-", "/", "*"])
opsArray.append(["+", "*", "/", "-"])
opsArray.append(["+", "*", "-", "/"])
opsArray.append(["+", "/", "-", "*"])
opsArray.append(["+", "/", "*", "-"])
opsArray.append(["-", "+", "*", "/"])
opsArray.append(["-", "+", "/", "*"])
opsArray.append(["-", "*", "/", "+"])
opsArray.append(["-", "*", "+", "/"])
opsArray.append(["-", "/", "+", "*"])
opsArray.append(["-", "/", "*", "+"])
opsArray.append(["*", "+", "-", "/"])
opsArray.append(["*", "+", "/", "-"])
opsArray.append(["*", "-", "/", "+"])
opsArray.append(["*", "-", "+", "/"])
opsArray.append(["*", "/", "+", "-"])
opsArray.append(["*", "/", "-", "+"])
opsArray.append(["/", "+", "-", "*"])
opsArray.append(["/", "+", "*", "-"])
opsArray.append(["/", "-", "*", "+"])
opsArray.append(["/", "-", "+", "*"])
opsArray.append(["/", "*", "+", "-"])
opsArray.append(["/", "*", "-", "+"])
opsArray.append(["+", "+", "+", "+"])
opsArray.append(["-", "-", "-", "-"])
opsArray.append(["*", "*", "*", "*"])
opsArray.append(["/", "/", "/", "/"])
let nums = array.map{ map[$0]! }.sorted()
let n1 = nums[0]
let n2 = nums[1]
let n3 = nums[2]
let n4 = nums[3]
var allNums = [[Int]]()
allNums.append([n1,n2,n3,n4])
allNums.append([n1,n2,n4,n3])
allNums.append([n1,n3,n4,n2])
allNums.append([n1,n3,n2,n4])
allNums.append([n1,n4,n2,n3])
allNums.append([n1,n4,n3,n2])
allNums.append([n2,n1,n3,n4])
allNums.append([n2,n1,n4,n3])
allNums.append([n2,n3,n1,n4])
allNums.append([n2,n3,n4,n1])
allNums.append([n2,n4,n1,n3])
allNums.append([n2,n4,n3,n1])
allNums.append([n3,n1,n2,n4])
allNums.append([n3,n1,n4,n2])
allNums.append([n3,n2,n1,n4])
allNums.append([n3,n2,n4,n1])
allNums.append([n3,n4,n1,n2])
allNums.append([n3,n4,n2,n1])
allNums.append([n4,n1,n2,n3])
allNums.append([n4,n1,n3,n2])
allNums.append([n4,n2,n1,n3])
allNums.append([n4,n2,n3,n1])
allNums.append([n4,n3,n2,n1])
allNums.append([n4,n3,n1,n2])
var exist = false
for array in allNums {
for ops in opsArray {
let result = handle(array, ops)
if result == 24 {
exist = true
break
}
}
if exist {
break
}
}
if !exist {
print("NONE")
}
}
}
func handle(_ nums: [Int], _ ops: [String]) -> Int {
let n1 = nums[0]
let n2 = nums[1]
let n3 = nums[2]
let n4 = nums[3]
let op1 = ops[0]
let op2 = ops[1]
let op3 = ops[2]
var result = calc(n1, n2, op: op1)
result = calc(result, n3, op: op2)
result = calc(result, n4, op: op3)
if result == 24 {
let map = [1 : "A", 2 : "2", 3 : "3", 4 : "4", 5 : "5", 6: "6", 7 : "7", 8 : "8", 9 : "9", 10: "10", 11: "J", 12 : "Q", 13 : "K"]
let m1 = map[n1]!
let m2 = map[n2]!
let m3 = map[n3]!
let m4 = map[n4]!
let express = m1 + op1 + m2 + op2 + m3 + op3 + m4
print(express)
}
return result
}
func calc(_ n1: Int, _ n2: Int, op: String) -> Int {
if op == "+" {
return n1 + n2
} else if op == "-" {
return n1 - n2
} else if op == "*" {
return n1 * n2
} else {
return n1 / n2
}
}