N QUEEN

KABIRA2010-12-17

  • テレビを見ていて
    • マス目を埋めるルールによって
    • n クイーン問題の解が一つ出せると思い書いてみた
  • ただしこれでは本当の解ではないようだ
    • クイーンの数が足りない
  • 原因は...
    • マスを埋める順番
    • A[i,j]に代入している数が適切かどうか(minを使う必要があるかどうか)
    • などだろうか
  • テレビでもいっていたように
    • この方法は全てのマスを埋めていて、その埋め方が主眼
    • クイーン以外のマスにも規則があるはず
N<-10
A<-matrix(0,N,N)
v<-1:(N^2)
for (i in 1:N){
for (j in 1:N){
u0<-c(A[i,],A[,j],diag(A[max(1,i-j+1):min(i+N-j,N),max(1,j-i+1):min(j+N-i,N)]),diag(A[min(i+j-1,N):max(1,i+j-N),max(1,j+i-N):min(i+j-1,N)]))  #縦横ナナメに使われている数字の集合

A[i,j]<-min(setdiff(v,u0))    #縦横ナナメに使われていない数字のうち最小の数を入れることに
}
}


n<-c()
for (i in 1:max(A)){
	n<-c(n,sum(A==i))
	}
image(A==which(n==max(n)),col=terrain.colors(10))
  • マスを埋める順番を下のようにかえても変わらないようだ
for(k in 2:(N+N)){
for(i in max(k-N,1):min((k-1),N)){
j<- min(k-i,N)
#print(i);print(j)

u0<-c(A[i,],A[,j],diag(A[max(1,i-j+1):min(i+N-j,N),max(1,j-i+1):min(j+N-i,N)]),diag(A[min(i+j-1,N):max(1,i+j-N),max(1,j+i-N):min(i+j-1,N)]))

A[i,j]<-min(setdiff(v,u0)) 

}
}