本帖最后由 种肉肉的农夫 于 2-9-2025 23:05 编辑
- def zobrist_bw_generate():
- counting = 0
- for y in range(20):
- for x in range(20):
- zobrist_b[y,x] = blackdata[counting]
- zobrist_w[y,x] = whitedata[counting]
- hugeCoord15[y,x] = [(cy,cx)
- for cy in range(max(0,y-2),min(15,y+3))
- for cx in range(max(0,x-2),min(15,x+3))
- if cx != x or cy != y]
- hugeCoord19[y,x] = [(cy,cx)
- for cy in range(max(0,y-2),min(19,y+3))
- for cx in range(max(0,x-2),min(19,x+3))
- if cx != x or cy != y]
- hugeCoord20[y,x] = [(cy,cx)
- for cy in range(max(0,y-2),min(20,y+3))
- for cx in range(max(0,x-2),min(20,x+3))
- if cx != x or cy != y]
- hugeCoord15[y,x] = tuple(hugeCoord15[y,x])
- hugeCoord19[y,x] = tuple(hugeCoord19[y,x])
- hugeCoord20[y,x] = tuple(hugeCoord20[y,x])
- counting += 1
复制代码
当然,真实情况必须要先在程序开始运行前运行一遍
这些就是将所有的点坐标全都存起来
因为你遍历的顺序是恒定的,点也是恒定的
其次,有个小技巧,就是要用tuple,这会比list快很多。
其次,就是要在check前准备好预处理数据:
shu = [[False,0,False,0,0,0] for _ in range(the_board_order)]
xie_1 = [[False,0,False,0,0,0] for _ in range(xie_static)]
xie_2 = [[False,0,False,0,0,0] for _ in range(xie_static)]
嗯是的,我是设了6个维度,六个变量,如果有更好的更精简的可以和我说
而且我前两天的确想到了一个只存一个变量的方法,但没空实现,等我真的做好后实现
其次
- extern "C" short get_cal_hash(const short key[4]){
- return ((key[0] << 12) | (key[1] << 8) | (key[2] << 4) | key[3]) % 83;
- }
复制代码
转换哈希值
是的,这是我用c++代码加速的函数,一开始你们可以用python写这个
准备一个打包好的表,像这样:
- const short hash_list[83] = {40, 0, 0, 2, 3, 0, -55, 55, 0, 0, 4, 5, -65, 65, 0, 0, 0, 0, 0, -200, 1, 0, 0, 0, 0, 0, 0, 0, -75, 75, 0, 0, 0, 0, 0, -200, 1, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 4, 5, 2, 3, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 2, 3, -40, 40, 0, 0, 0, 0, 0, -55, 55, 0, 0, 0, 0, 2, 3, 0, -40};
复制代码
你看这个肯定看不懂,但是你看看这个东西怎么生成的就明白了
额生成的那个文件给我删了
就说下逻辑吧,就是先准备好这个:
- complex_values = {
- (5,2,1,2): 5,
- (4,2,0,2): 5,
- (5,2,1,1): 4,
- (4,2,0,1): 4,
- (4,2,1,2): 3,
- (4,1,0,2): 3,
- (4,1,1,2): 3,
- (5,0,1,2): 3,
- (4,0,1,2): 3,
- (5,1,1,2): 3,
- (4,2,1,1): 2,
- (4,1,0,1): 2,
- (4,1,1,1): 2,
- (5,0,1,1): 2,
- (4,0,1,1): 2,
- (5,1,1,1): 2,
- (3, 2, 1, 2): 1,
- (3, 2, 0, 2): 1,
- ####### 不可以是 1 2 3,4 5
- (3, 1, 1, 2): 75,
- (3, 1, 0, 2): 65,
- (2, 2, 0, 2): 55,
- (2, 2, 1, 2): 55,
- (2, 1, 0, 2): 40,
- (2, 1, 1, 2): 40,
- (3, 1, 1, 1): -75,
- (3, 1, 0, 1): -65,
- (2, 2, 0, 1): -55,
- (2, 2, 1, 1): -55,
- (2, 1, 0, 1): -40,
- (2, 1, 1, 1): -40,
- (3, 2, 1, 1): -200,
- (3, 2, 0, 1): -200,
- }
复制代码
代表每种可能的值
其次,例如(3,2,0,1),就用上面那个c++函数转化成哈希值,然后存到表里面去
最后生成那个外星人也看不懂的表格
看懂了这些,O(1)就实现了
不过自然,这和真实的O(1)还是有区别的,但是在形式上至少做到了O(1)
---
最后,真挚的像黄泓睿同学道歉 |