3

最初の問題: 与えられた 3x3 tic tac toe ボードについて、プレイヤーの 1 人が勝ったかどうかを確認します。

これまでに思いついた最も簡単な解決策は、行列を回転させて各行を合計することです。

board
[[0, 1, 2], [3, 4, 5], [6, 7, 8]]

pr(board)
0 1 2
3 4 5
6 7 8

pr(zip(*board))
0 3 6
1 4 7
2 5 8

上記の 0..9 の数字は、ボード上の位置を示すためのものです。通常、プレーヤー 1 は 1、プレーヤー 2 は -1、空いている位置は 0 で埋められます。行ごとに進み、合計が 3 または -3 になると、これが勝利ブロックです。

ただし、対角線はチェックされません。そのような行列からエレガントで高性能な方法で対角線を抽出する方法はありますか? 「手動で」単純なインデックス (0、1、2) を使用するという意味ではなく、nxn 行列の対角線を取得します。

PS pr は、2 次元リストを印刷するための単なるヘルパー関数です。

def pr(x):
    for row in x:
        print ' '.join(map(str, row))
4

5 に答える 5

11

次の方法で 1 つの対角線を取得できます。

[r[i] for i, r in enumerate(board)]
# [0, 4, 8]

そして反対の対角線:

[r[-i-1] for i, r in enumerate(board)]
# [2, 4, 6]
于 2013-02-26T22:40:15.300 に答える
3

魔方陣でゲーム フィールドに番号を付ける

2|9|4
7|5|3
6|1|8

3 手後に合計し、合計が 15 であるかどうかを確認します --> 勝者。すべてのプレイヤーについてこれを確認する必要があります。確かに4手目、5手目以降は再確認が必要です(ゲームを始めたプレイヤーのみ)

これが、最初の Java クラスでこの問題を解決した方法です。

于 2013-02-26T22:46:57.963 に答える
2

正方形のボードの対角線は、インデックスが等しい場所にあるため、3x3 ボードの場合 board[0][0]、 、board[1][1]、および、board[2][2]または 2 つの合計がボード サイズ 1 (この場合は 3 か所) になる場所: board[0][2]board[1][1]、およびboard[2][0]--board[1][1]必要に応じて、両方のセットに含まれていることに注意してください。これらの事実により、それらを計算するための Python コードをかなり簡単に記述できます。

board = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
BOARD_SIZE = len(board)

diags1 = [board[i][i] for i in xrange(BOARD_SIZE)]
diags2 = [board[i][BOARD_SIZE-1-i] for i in xrange(BOARD_SIZE)]

print diags1
print diags2

出力:

[0, 4, 8]
[2, 4, 6]
于 2013-02-27T00:02:14.857 に答える
2

おそらく、必要なものは にあります。 Python でマトリックス/リストのリスト内のすべての対角線を取得するnumpyを参照してください。たぶん、これを使用して、他のソリューションを取得するために行ったように裏返すことができます。

if sum(board[i][i] for i in (0, 1, 2)) in (-3, 3):
    true
于 2013-02-26T22:39:57.037 に答える
1

これにより、一方向(左上から右下)の対角要素を含むリストが得られます。

[board[i][i] for i in range(len(board))]

これは反対方向にも同じことを行います:

[board[i][len(board)-i-1] for i in range(len(board))]
于 2013-02-26T22:40:19.923 に答える