22. 同一行のクイーンを排除
board=()
row=()
queen() {
local i
if (($1 >= 4)); then
echo ${board[@]}
else
for ((i = 1; i <= 4; ++i)); do
if ((!row[i])); then
row[$i]=1
board[$1]=$i
queen $(($1 + 1))
row[$i]=0
fi
done
fi
}
queen 0
23. 斜めのクイーンを排除
board=()
row=()
up=()
down=()
queen() {
local i
if (($1 >= 4)); then
echo ${board[@]}
else
for ((i = 1; i <= 4; ++i)); do
if ((!row[i]&&!up[$1+i]&&!down[$1-i+4])); then
((row[$i] = up[$1+i] = down[$1-i+4] = 1))
board[$1]=$i
queen $(($1 + 1))
((row[$i] = up[$1+i] = down[$1-i+4] = 0))
fi
done
fi
}
queen 0
24. nクイーン問題に拡張
n=$1
board=()
row=()
up=()
down=()
queen() {
local i
if (($1 >= n)); then
echo ${board[@]}
else
for ((i = 1; i <= n; ++i)); do
if ((!row[i]&&!up[$1+i]&&!down[$1-i+n])); then
((row[$i] = up[$1+i] = down[$1-i+n] = 1))
board[$1]=$i
queen $(($1 + 1))
((row[$i] = up[$1+i] = down[$1-i+n] = 0))
fi
done
fi
}
queen 0
36. 同一行のクイーンを排除
f() { awk '{for(i=1;i<=4;++i)print $0,i}'; }
g() { awk '{for(i=1;i<NF;++i)if($i==$NF)next;print}'; }
echo | f | g | f | g | f | g | f | g
37. 斜めのクイーンを排除
f() { awk '{for(i=1;i<=4;++i)print $0,i}'; }
g() { awk '{for(i=1;i<NF;++i)if($i==$NF)next;print}'; }
h() { awk '{for(i=1;i<NF;++i)if($i+i==$NF+NF)next;print}'; }
i() { awk '{for(i=1;i<NF;++i)if($i-i==$NF-NF)next;print}'; }
echo | f | g | h | i | f | g | h | i | f | g | h | i | f | g | h
| i
38. 関数をまとめる
f() {
awk '{for(i=1;i<=4;++i)print $0,i}' |
awk '{for(i=1;i<NF;++i)if($i==$NF)next;print}' |
awk '{for(i=1;i<NF;++i)if($i+i==$NF+NF)next;print}' |
awk '{for(i=1;i<NF;++i)if($i-i==$NF-NF)next;print}'
}
echo | f | f | f | f