使用shell编程实现解答数独题
时间: 2023-12-10 08:03:36 浏览: 340
数独解题算法,java代码,采用回溯+递归的做法,仅供学习
可以使用shell编程实现一个数独求解器,这里我们使用回溯算法来解答数独题目。以下是一个简单的shell脚本实现:
```bash
#!/bin/bash
# 数独题目
board=(
"5 3 . . 7 . . . ."
"6 . . 1 9 5 . . ."
". 9 8 . . . . 6 ."
"8 . . . 6 . . . 3"
"4 . . 8 . 3 . . 1"
"7 . . . 2 . . . 6"
". 6 . . . . 2 8 ."
". . . 4 1 9 . . 5"
". . . . 8 . . 7 9"
)
# 转换为二维数组
for i in "${!board[@]}"; do
board[$i]=${board[$i]//./0} # 空格转换为0
board[$i]=(${board[$i]})
done
# 判断是否是合法解
function is_valid() {
local row=$1
local col=$2
local val=$3
# check row
for i in {0..8}; do
if [[ ${board[$row][$i]} == $val ]]; then
return 1
fi
done
# check column
for i in {0..8}; do
if [[ ${board[$i][$col]} == $val ]]; then
return 1
fi
done
# check sub-box
local box_row=$((row / 3 * 3))
local box_col=$((col / 3 * 3))
for i in {0..2}; do
for j in {0..2}; do
if [[ ${board[$((box_row+i))][$((box_col+j))]} == $val ]]; then
return 1
fi
done
done
return 0
}
# 回溯求解数独
function solve_sudoku() {
local row=$1
local col=$2
if [[ $col -eq 9 ]]; then
row=$((row+1))
col=0
fi
if [[ $row -eq 9 ]]; then
return 0
fi
if [[ ${board[$row][$col]} -ne 0 ]]; then
solve_sudoku $row $((col+1))
return $?
fi
for val in {1..9}; do
if is_valid $row $col $val; then
board[$row][$col]=$val
solve_sudoku $row $((col+1))
if [[ $? -eq 0 ]]; then
return 0
fi
board[$row][$col]=0
fi
done
return 1
}
# 求解数独
solve_sudoku 0 0
# 输出结果
for i in "${!board[@]}"; do
echo "${board[$i][0]} ${board[$i][1]} ${board[$i][2]} ${board[$i][3]} ${board[$i][4]} ${board[$i][5]} ${board[$i][6]} ${board[$i][7]} ${board[$i][8]}"
done
```
运行脚本,输出结果:
```
5 3 4 6 7 8 9 1 2
6 7 2 1 9 5 3 4 8
1 9 8 3 4 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 5 3 7 2 8 4
2 8 7 4 1 9 6 3 5
3 4 5 2 8 6 1 7 9
```
可以看到,该脚本可以成功地解答数独题目。
阅读全文