#16222: bash shell


a0983095871@gmail.com (Lesson One)

學校 : 不指定學校
編號 : 73922
來源 : [1.168.170.69]
最後登入時間 :
2023-11-26 17:44:09
a016. 數獨(SUDOKU) | From: [111.246.64.98] | 發表日期 : 2018-12-08 16:11

#!/bin/bash
# your code goes here
passvar=
function isunique () { #判斷一列是否有重複的數字出現
	tmp=$@
	remove_the_same=`echo $tmp | tr " " "\n" | sort -u | tr "\n" " "`
	tmp=`echo $tmp | tr " " "\n" | sort | tr "\n" " "`
	if [ "${#tmp}" -ne "${#remove_the_same}" ]; then
		passvar=1
	else
		passvar=0
	fi
}
while true; do #讀取許多組數獨
	arr_hori=() #存取橫列的陣列
	yesno=0 #最後結果
	for i in `seq 1 9`; do #讀取數獨每一列
		read tmp
		arr_hori+=(["$i"]=$tmp)
	done
	for i in `seq 1 9`; do #判斷數獨每一列是否有重複
		isunique ${arr_hori["$i"]}
		if [ $passvar -eq 1 ]; then
			break
			break
		fi
	done
	arr_ver=() #存取直行的陣列
	for i in `seq 1 9`; do #將數獨的每一個直行存入arr_ver
		for j in `seq 1 9`; do
			tmp=`echo ${arr_hori["$j"]} | cut -d ' ' -f $i`
			row=`echo "$row $tmp"`
		done
		arr_ver+=(["$i"]=$row)
		row=
	done
	for i in `seq 1 9`; do #判斷數獨每一行是否有重複
		isunique ${arr_ver["$i"]}
		if [ $passvar -eq 1 ]; then
			yesno=1
			break
			break
		fi
	done
	arr_sudoku=() #存取九宮格的陣列
	#以下將數獨的九宮格中的數字存入arr_sudoku
	for i in `seq 1 3 9`; do #1,4,7 
		for j in `seq 1 3 9`; do #1,4,7
			for k in `seq 0 2`; do #0,1,2
				num1=$((i + k))
				num2=$((j + 2))
				tmp=`echo ${arr_hori["$num1"]} | cut -d ' ' -f $j-$num2`
				row=`echo "$row $tmp"`
			done
			if [ $j -eq 1 ]; then
				ind=0
			elif [ $j -eq 4 ]; then
				ind=1
			else
				ind=2
			fi
			ind=$((i + ind))
			arr_sudoku+=(["$ind"]="$row")
			row=
		done
	done
	for i in `seq 1 9`; do #判斷每個小九宮格是否有重複
		isunique ${arr_sudoku["$i"]}
		if [ $passvar -eq 1 ]; then
			yesno=1
			break
			break
		fi
	done
	if [ $yesno -eq 0 ]; then #判斷最後結果
		echo "yes"
	else
		echo "no"
	fi
	read nline #讀取一個空行
	if [ $? -ne 0 ]; then #如果連空行都沒有表示沒有下一組數獨
		break
	fi
done
 
ZeroJudge Forum