8-Queen
https://gyazo.com/942a93103f9ead8908fb3a49800ce68b.png
exec
code:8queen.js
function setup(){
col = [];
qpos = [];
up = {};
down = {};
nqueens = 8;
var i;
for(i=0;i<nqueens;i++){
coli = qposi = 0;
}
for(i= -nqueens;i<nqueens;i++){
upi+nqueens = 0;
downi+nqueens = 0;
}
expand(0);
}
function output(){
var i;
var s = '';
for(i=0;i<nqueens;i++){
s += qposi;
}
console.log(s);
}
function expand(n){
for(var c=0;c<nqueens;c++){
if(colc == 0 && upn+c == 0 && downn-c+nqueens == 0){
qposn = c;
if(n+1 >= nqueens){
output();
}
else {
colc = upn+c = downn-c+nqueens = 1;
expand(n+1);
colc = upn+c = downn-c+nqueens = 0;
}
}
}
}
Generatorの使い方がおかしくて動かない
exec
code:8queen2.js
function setup(){
col = [];
qpos = [];
up = {};
down = {};
nqueens = 8;
var i;
for(i=0;i<nqueens;i++){
coli = qposi = 0;
}
for(i= -nqueens;i<nqueens;i++){
upi+nqueens = 0;
downi+nqueens = 0;
}
gen = expand(0);
}
function mouseClicked(){ // クリックすると次々と値を表示する
background('#ff8')
//clear()
value = gen.next().value
text(value.join(' '), 30, 40)
}
function* expand(n){
for(var c=0;c<nqueens;c++){
if(colc == 0 && upn+c == 0 && downn-c+nqueens == 0){
qposn = c;
if(n+1 >= nqueens){
yield qpos; // これは無理か?
}
else {
colc = upn+c = downn-c+nqueens = 1;
expand(n+1);
colc = upn+c = downn-c+nqueens = 0;
}
}
}
}
code:ruby
#
# Generate and Testで8-Queenを解く
#
(0..7).to_a.permutation { |a|
h = {}
collision = false
(0..7).each { |x|
y = ax
collision = true if hx+y
break if collision
hx+y = true
}
next if collision
h = {}
collision = false
(0..7).each { |x|
y = ax
collision = true if hx-y
break if collision
hx-y = true
}
next if collision
puts a.join('-')
}
再帰を使うのが一般的だと思うがこの程度なら力技でも大丈夫なようだ
魔方陣でも大丈夫かも
解を生成するプログラムと表示するプログラムを別プロセスにしたい
#パズル #再帰 #バックトラック