|
如果从横向,纵向和斜向对棋盘进行剖分,那我们可以获得——
两组19个长19的列表和两组长1 2 3 4 ... 18 19 18 ... 4 3 2 1的列表!(这是废话吗 是的)
对于前面两种情况,我们可以很容易写出如下代码:
for i in range(BOARD_NUM):
for j in range(BOARD_NUM):
if board[i][j]==0:
line[j]=0
else:
line[j]=(board[i][j]==对手棋子类型)+1 (这么写很欠揍,但是这么写好爽)
这样我们就可以获得一条line(横向还是纵向?),上面有0, 1和2~
那对角线可能就会难一点实现了——
for i in range(BOARD_NUM*2-1):
line=[0 for k in range(min(i+1,37-i))]#1 2 3 ... 18 19 18 ... 3 2 1
for j in range(min(???)):
if i<BOARD_NUM:
if board[j][i-j]==0:
line[j]=0
else:
line[j]=(board[j][i-j]==对手棋子类型)+1
else:
if board[???][???]==0:
line[j]=0
else:
line[j]=(board[???][???]==对手棋子类型)+1
思考:这段代码刻画的是主对角线还是副对角线?
前半部分刻画的是对角线上的line,后半部分刻画的是对角线下的line,如何正确将其取出?
这种算法可以在O(n)的复杂度内把棋盘变成列表,之后我们就可以对每一个列表进行分析,而不丢失棋盘的任何信息,因为五子棋只考虑横,纵和斜。(真的吗?) |
|