shell编程实现解答数独题
时间: 2023-07-11 17:16:56 浏览: 127
当然,数独也可以使用Shell脚本来解答,下面是一个简单的Shell脚本实现:
```bash
#!/bin/bash
board=(0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0)
# 输出数独
function printBoard {
for ((i=0; i<9; i++)) do
for ((j=0; j<9; j++)) do
echo -n "${board[i*9+j]} "
if [[ $((j+1))%3 -eq 0 ]] && [[ $((j+1)) -ne 9 ]]; then
echo -n "| "
fi
done
echo
if [[ $((i+1))%3 -eq 0 ]] && [[ $((i+1)) -ne 9 ]]; then
echo "------+-------+------"
fi
done
}
# 判断某个数字是否可以放在数独的某个位置上
function check {
local row=$1
local col=$2
local num=$3
# 判断同一行是否有相同的数字
for ((i=0; i<9; i++)) do
if [[ ${board[row*9+i]} -eq $num ]]; then
return 1
fi
done
# 判断同一列是否有相同的数字
for ((i=0; i<9; i++)) do
if [[ ${board[i*9+col]} -eq $num ]]; then
return 1
fi
done
# 判断同一个3*3的宫格内是否有相同的数字
local start_row=$((row/3*3))
local start_col=$((col/3*3))
for ((i=start_row; i<start_row+3; i++)) do
for ((j=start_col; j<start_col+3; j++)) do
if [[ ${board[i*9+j]} -eq $num ]]; then
return 1
fi
done
done
return 0
}
# 递归函数填充数独
function solve {
local row=$1
local col=$2
# 如果当前行和列都大于等于9,表示已经填充完毕,返回0
if [[ $row -ge 9 ]] && [[ $col -ge 9 ]]; then
return 0
fi
# 如果当前列大于等于9,表示当前行填充完毕,转到下一行
if [[ $col -ge 9 ]]; then
row=$((row+1))
col=0
fi
# 如果当前位置已经有数字,跳过,转到下一列
if [[ ${board[row*9+col]} -ne 0 ]]; then
solve $row $((col+1))
return $?
fi
# 尝试填充数字1~9
for ((i=1; i<=9; i++)) do
if check $row $col $i; then
board[row*9+col]=$i
# 如果能够成功填充,继续填充下一个位置
if solve $row $((col+1)); then
return 0
fi
# 如果填充失败,回溯,将当前位置的数字清零
board[row*9+col]=0
fi
done
# 如果1~9都不能填充成功,返回1
return 1
}
echo "请输入数独(用0表示空白格):"
for ((i=0; i<9; i++)) do
read -a line
for ((j=0; j<9; j++)) do
board[i*9+j]=${line[j]}
done
done
echo "输入的数独为:"
printBoard
if solve 0 0; then
echo "解答结果为:"
printBoard
else
echo "无解!"
fi
```
这个脚本可以通过输入9*9的数独,输出解答结果。需要注意的是,这个脚本是使用Bash编写的,不能在Windows上直接运行,需要在Linux或MacOS上运行。
阅读全文