สมมติว่ามีผู้เล่นสองคนเล่นเกมผลัดกันเล่นบนไบนารีทรี เรามีรูทของไบนารีทรีนี้และจำนวนโหนด n ในทรี โดยที่ n เป็นเลขคี่ และแต่ละโหนดมีค่าต่างกันตั้งแต่ 1 ถึง n ในตอนแรก ผู้เล่นคนแรกตั้งชื่อค่า x ด้วย 1 <=x <=n และผู้เล่นคนที่สองตั้งชื่อค่า y ด้วย 1 <=y <=n และถือเงื่อนไขดังกล่าว y !=x ผู้เล่นคนแรกระบายสีโหนดด้วยค่า x สีแดง และผู้เล่นคนที่สองระบายสีโหนดด้วยค่า y สีน้ำเงิน หลังจากนั้นผู้เล่นผลัดกันโดยเริ่มจากผู้เล่นคนแรก ในแต่ละเทิร์น ผู้เล่นจะใช้โหนดที่มีสีของตน (สีแดงสำหรับผู้เล่น 1, สีน้ำเงินสำหรับผู้เล่น 2) และระบายสีเพื่อนบ้านที่ไม่มีสีของโหนดที่เลือก (ไม่ว่าจะเป็นลูกซ้ายหรือขวา หรือผู้ปกครองของโหนดที่รับ) หากผู้เล่นไม่สามารถใช้โหนดในลักษณะนี้ได้ พวกเขาต้องผ่านเทิร์นของพวกเขา หากผู้เล่นทั้งคู่ผ่านเทิร์น เกมจะจบลง และผู้ชนะคือผู้เล่นที่ทำสีให้โหนดมากขึ้น
สมมุติว่าเราเป็นผู้เล่นคนที่สอง หากเป็นไปได้ที่จะเลือก y ดังกล่าวเพื่อให้แน่ใจว่าเราชนะเกม คืนค่า จริง หากไม่สามารถทำได้ ให้คืนค่าเท็จ
ดังนั้นถ้าต้นไม้เป็นเหมือน −
และ n คือ 11 และ x คือ 3 ดังนั้นผลลัพธ์จะเป็นจริง เนื่องจากผู้เล่นคนที่สองสามารถนำโหนดที่มีค่า 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดวิธีการที่เรียกว่า Solve() ซึ่งจะใช้โหนด x l และ r โดยที่ l และ r เป็นเท็จในขั้นต้น ซึ่งจะมีลักษณะดังนี้ -
-
หากไม่มีโหนด ให้กลับและออก
-
ถ้า l เป็นจริง ให้เพิ่ม leftVal ขึ้น 1 มิฉะนั้น เมื่อ r เป็นจริง ให้เพิ่ม rightVal ขึ้น 1
-
หากค่าโหนดคือ x ให้เรียกโปรแกรมแก้ไข (ด้านซ้ายของโหนด x จริง เท็จ) และเรียกโปรแกรมแก้ไข (ด้านขวาของโหนด x เท็จ จริง)
-
มิฉะนั้น call Solve (ด้านซ้ายของโหนด x, l, r) และ call dissolve (ด้านขวาของโหนด x, l, r)
-
วิธีการหลักจะเป็นเช่น -
-
nodeToX :=0, leftVal :=0, rightVal :=0
-
แก้การโทร (รูท, x, เท็จ, เท็จ)
-
nodeToX :=n – leftVal – rightVal – 1
-
temp :=สูงสุดของ rightVal, nodeToX และ leftVal
-
คืนค่าเท็จ if (nodeToX + leftVal + rightVal – (2*temp)>=0) มิฉะนั้น จริง
ตัวอย่าง(Python)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
class TreeNode: def __init__(self, data, left = None, right = None): self.data = data self.left = left self.right = right def insert(temp,data): que = [] que.append(temp) while (len(que)): temp = que[0] que.pop(0) if (not temp.left): if data is not None: temp.left = TreeNode(data) else: temp.left = TreeNode(0) break else: que.append(temp.left) if (not temp.right): if data is not None: temp.right = TreeNode(data) else: temp.right = TreeNode(0) break else: que.append(temp.right) def make_tree(elements): Tree = TreeNode(elements[0]) for element in elements[1:]: insert(Tree, element) return Tree class Solution(object): def btreeGameWinningMove(self, root, n, x): self.nodeToX = 0 self.leftVal = 0 self.rightVal = 0 self.solve(root,x) self.nodeToX = n - self.leftVal - self.rightVal - 1 temp = max(self.rightVal,max(self.nodeToX,self.leftVal)) return not (self.nodeToX + self.leftVal + self.rightVal - (2*temp)>=0) def solve(self,node,x,l= False,r = False): if not node: return if l: self.leftVal+=1 elif r: self.rightVal+=1 if node.data == x: self.solve(node.left,x,True,False) self.solve(node.right,x,False,True) else: self.solve(node.left,x,l,r) self.solve(node.right,x,l,r) ob = Solution() root = make_tree([1,2,3,4,5,6,7,8,9,10,11]) print(ob.btreeGameWinningMove(root, 11, 3))
อินพุต
[1,2,3,4,5,6,7,8,9,10,11] 11 3
ผลลัพธ์
true