数独 - 永野護
2025/09/20 (Sat) 18:04:28
下記は数独を解くpythonコードです。十進basicに移植したらどうなるでしょうか。
# 数独全解探索プログラム (バックトラック法)
# --- 問題データ(0は空白) ---
board = [
[5,3,0,0,7,0,0,0,0],
[6,0,0,1,9,5,0,0,0],
[0,9,8,0,0,0,0,6,0],
[8,0,0,0,6,0,0,0,3],
[4,0,0,8,0,3,0,0,1],
[0,0,0,0,2,0,0,0,6],
[0,6,0,0,0,0,2,8,0],
[0,0,0,0,1,9,0,0,0],
[0,0,0,0,8,0,0,0,0]
]
solution_count = 0
def print_board(b):
"""盤面を表示"""
for r in range(9):
for c in range(9):
print(b[r][c], end=" ")
print()
print()
def is_valid(b, r, c, num):
"""(r,c) に num を置けるか判定"""
# 行チェック
# if num in b[r]:
for i in range(9):
if b[r][i]==num:
return False
# 列チェック
for i in range(9):
if b[i][c] == num:
return False
# 3x3 ブロックチェック
r0 = (r // 3) * 3
c0 = (c // 3) * 3
for i in range(3):
for j in range(3):
if b[r0+i][c0+j] == num:
return False
return True
def solve(b):
"""バックトラックで全解探索"""
global solution_count
for r in range(9):
for c in range(9):
if b[r][c] == 0:
for num in range(1, 10):
if is_valid(b, r, c, num):
b[r][c] = num
solve(b)
b[r][c] = 0
return # このマスが埋まらなければ戻る
# 空マスがない = 解を発見
solution_count += 1
print(f"---- 解 {solution_count} ----")
print_board(b)
# --- 実行 ---
solve(board)
print("総解数 =", solution_count)
Re: 数独
- SHIRAISHI Kazuo
2025/09/22 (Mon) 12:46:06
問題データの記述はDATA文,配列への読み込みはMAT READ,
大域変数solution_countはモジュールのPUBLIC変数に,
True, Falseは数値の1,0か,文字列の"Y',"N"で代用する,
といったところでしょうか。
Re: 数独
- しばっち
2025/09/23 (Tue) 07:53:02
pythonプログラムから十進basicへの移植を人工知能AI(copilot)に頼んでみた。
一部若干の修正が必要でしたが、ほぼ完ぺきに移植できていました。
移植とは2つの言語理解を必要とする高度な作業ですが
どうやらAIでも行えるようです。
これからはAIを活用していくことで言語習得の手助けとなりそうです。
PUBLIC NUMERIC SOLUTION_COUNT
!' --- 問題データ(0は空白) ---
DIM board(1 TO 9, 1 TO 9)
DATA 5,3,0,0,7,0,0,0,0
DATA 6,0,0,1,9,5,0,0,0
DATA 0,9,8,0,0,0,0,6,0
DATA 8,0,0,0,6,0,0,0,3
DATA 4,0,0,8,0,3,0,0,1
DATA 0,0,0,0,2,0,0,0,6
DATA 0,6,0,0,0,0,2,8,0
DATA 0,0,0,0,1,9,0,0,0
DATA 0,0,0,0,8,0,0,0,0
FOR i = 1 TO 9
FOR j = 1 TO 9
READ board(i,j)
NEXT j
NEXT i
LET solution_count = 0
!' --- 実行 ---
CALL solve(board)
PRINT "総解数 ="; solution_count
END
!' --- 盤面表示 ---
EXTERNAL SUB print_board(b(,))
FOR r = 1 TO 9
FOR c = 1 TO 9
PRINT b(r,c);
NEXT c
PRINT
NEXT r
PRINT
END SUB
!' --- (r,c) に num を置けるか判定 ---
EXTERNAL FUNCTION is_valid(b(,), r, c, num)
!' 行チェック
FOR i = 1 TO 9
IF b(r,i) = num THEN
LET is_valid = 0
EXIT FUNCTION
END IF
NEXT i
!' 列チェック
FOR i = 1 TO 9
IF b(i,c) = num THEN
LET is_valid = 0
EXIT FUNCTION
END IF
NEXT i
!' 3x3 ブロックチェック
LET r0 = INT((r - 1) / 3) * 3 + 1
LET c0 = INT((c - 1) / 3) * 3 + 1
FOR i = 0 TO 2
FOR j = 0 TO 2
IF b(r0 + i, c0 + j) = num THEN
LET is_valid = 0
EXIT FUNCTION
END IF
NEXT j
NEXT i
LET is_valid = 1
END FUNCTION
!' --- バックトラックで全解探索 ---
EXTERNAL SUB solve(b(,))
FOR r = 1 TO 9
FOR c = 1 TO 9
IF b(r,c) = 0 THEN
FOR num = 1 TO 9
IF is_valid(b, r, c, num)=1 THEN
LET b(r,c) = num
CALL solve(b)
LET b(r,c) = 0
END IF
NEXT num
EXIT SUB
END IF
NEXT c
NEXT r
!' 空マスがない = 解を発見
LET solution_count = solution_count + 1
PRINT "---- 解"; solution_count; " ----"
CALL print_board(b)
END SUB
実行結果
---- 解 1 ----
5 3 1 6 7 8 4 9 2
6 2 4 1 9 5 3 7 8
7 9 8 3 4 2 1 6 5
8 1 2 9 6 4 7 5 3
4 7 6 8 5 3 9 2 1
3 5 9 7 2 1 8 4 6
1 6 5 4 3 7 2 8 9
2 8 7 5 1 9 6 3 4
9 4 3 2 8 6 5 1 7
---- 解 2 ----
5 3 1 6 7 8 4 9 2
6 2 4 1 9 5 3 7 8
7 9 8 3 4 2 1 6 5
8 1 2 9 6 4 7 5 3
4 7 6 8 5 3 9 2 1
9 5 3 7 2 1 8 4 6
1 6 5 4 3 7 2 8 9
2 8 7 5 1 9 6 3 4
3 4 9 2 8 6 5 1 7
---- 解 3 ----
5 3 1 6 7 8 4 9 2
6 2 4 1 9 5 3 7 8
7 9 8 3 4 2 1 6 5
8 1 2 9 6 4 7 5 3
4 7 6 8 5 3 9 2 1
9 5 3 7 2 1 8 4 6
1 6 9 5 3 7 2 8 4
2 8 5 4 1 9 6 3 7
3 4 7 2 8 6 5 1 9
中略
---- 解 130 ----
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 4 3 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
3 6 1 5 4 7 2 8 9
2 8 5 3 1 9 6 7 4
9 4 7 2 8 6 1 3 5
---- 解 131 ----
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 4 3 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 3 4 7 2 8 5
2 8 7 5 1 9 6 3 4
3 4 5 2 8 6 1 7 9
---- 解 132 ----
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 4 3 2 5 6 7
8 5 9 7 6 1 4 2 3
4 2 6 8 5 3 7 9 1
7 1 3 9 2 4 8 5 6
9 6 1 3 4 7 2 8 5
3 8 5 2 1 9 6 7 4
2 4 7 5 8 6 1 3 9
総解数 = 132