- 論壇徽章:
- 0
|
用bash完成八皇后問題
- #/bin/bash
- canSet() { # 檢查是否可放下皇后的子程序.
- for ((n=0;n<y;n++)) ;do
- ((P[$n] == x)) && return 1 # 檢查是否同一行, 如果是返回1 false
- ((P[$n] == x - n + y )) && return 1 #檢查斜行.
- ((P[$n] == x + n - y )) && return 1 #檢查另一方向斜行.
- done
- return 0 # 返回成功.
- }
- # init
- y=0 # y 是行,
- for((i=0;i<8;i++)) ;do
- P[$i]=-1 # p 是座位array , -1是不在棋盤上.
- done
- while (((y<8)&&(y>=0)));do #如果y>=8, 即找到結(jié)果, 如果y<0, 即找不到結(jié)果, 退出迴圈
- # echo ${P[*]}; # 打開這一注解,可看script 運行過程
- f=0 # 設(shè)flag = 0, 用它檢查否一整能不能放下皇后
- s=${P[$y]}+1 # 每一行皇后放下的列位罝+1
- for ((x=s;x<8;x++)); do #其他shell 用 for x in seq $s 7
- if canSet ;then #如果可放下, 則
- P[$y]=$x #記下皇后位罝
- ((y++)) # 行位罝加1, 如用其他shell, 用 y=`expr $y + 1`代替
- f=1 #設(shè)flag=1,即可效皇后.
- break #處理下一個皇后
- fi
- done
- if [ $f -eq 0 ];then # 如果整行都不能放下皇后.則
- P[$y]=-1 #將皇后由棋盤上拿下.
- ((y--)) #行位罝-1.
- fi
- done
- echo ${P[*]}; 打印數(shù)據(jù)
復(fù)制代碼 |
|