试题编号: | 201803-4 |
试题名称: | 棋局评估 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 Alice和Bob正在玩井字棋游戏。 输入格式 输入的第一行包含一个正整数T,表示数据的组数。 输出格式 对于每组数据,输出一行一个整数,表示当前局面的得分。 样例输入 3 样例输出 3 样例说明 第一组数据: 数据规模和约定 对于所有评测用例,1 ≤ T ≤ 5。 |
from copy import deepcopy
def end(now):
for i in range(3):
if now[i][0] == now[i][1] == now[i][2] == 1:
return 1
elif now[i][0] == now[i][1] == now[i][2] == 2:
return 2
for j in range(3):
if now[0][j] == now[1][j] == now[2][j] ==1:
return 1
elif now[0][j] == now[1][j] == now[2][j] ==2:
return 2
if now[0][0] == now[1][1] == now[2][2] ==1 or now[0][2] == now[1][1] == now[2][0] ==1:
return 1
if now[0][2] == now[1][1] == now[2][0] ==2 or now[0][0] == now[1][1] == now[2][2] ==2:
return 2
return 0
def get_next(cur_node,player, point):
i = int(point/3)
j = point%3
node = deepcopy(cur_node)
node[i][j] = player
return node
def res(end,node):
if end == 1:#win
res = 1
for i in range(3):
for j in range(3):
if not node[i][j]:
res+=1
elif end == 2:#lose
res = -1
for i in range(3):
for j in range(3):
if not node[i][j]:
res-=1
return res
def maxmin(player , cur_node,alph, bet):
en = end(cur_node)
if en:
return res(en,cur_node)
node_list = [] #0-8
for i in range(3):
for j in range(3):
if not cur_node[i][j]:
node_list.append(i*3+j)
blank = len(node_list)
if not blank: #ping
return 0
#print(cur_node[0],'\n\r',cur_node[1],'\n\r',cur_node[2])
#print()
alpha = alph
beta = bet
if player == 1:
#best = 0-blank
alpha = -10
for i in node_list:
new_node = get_next(cur_node,player,i)
val = maxmin(2, new_node,alpha,beta)
if val>=beta:
return val
if val>=alpha:
alpha=val
#print('alpha',alpha)
return alpha
else: #2
#best = blank
beta = 10
for i in node_list:
new_node = get_next(cur_node,player,i)
val = maxmin(1, new_node,alpha,beta)
if val<=alpha:
return val
if val<=beta:
beta=val
#print('beta',beta)
return beta
n = int(input())
inp = [[0,0,0],
[0,0,0],
[0,0,0]]
for i in range(n):
for j in range(3):
a = input().split()
inp[j][0] = int(a[0])
inp[j][1] = int(a[1])
inp[j][2] = int(a[2])
result = maxmin(1,inp,-10,10)
print(result)
100分啦,O(∩_∩)O哈哈~。。做了差不多两天了。
注意:python函数调用时的参数是传引用,类似于C++的int my(&a) 所以最好在函数里声明一个变量(beta,alpha)赋值这些参数,这样修改时不至于改变原参数的值。