移動によって解を探す

KABIRA2010-12-19

N<-10
T<-200
A<-B<-matrix(0,N,N)
A[sample(1:N^2,9)]<-1   #とりあえず9個のクイーンをおく
u<-c()
for ( t in 1:T){


for (i0 in N:1){
for (j0 in N:1){
	if(A[i0,j0]>0){
	for(k in 1:A[i0,j0]){
#		i <- i0
#		j <- j0

	
#   8  1  2
#   7  9  3
#   6  5  4
#周囲(1から8)と今いる場所(9の場所)にいくつのクイーンが"効いて"いるかを調べる

	for (d in 1:9){
	dir <- d	
	i <- i0
	j <- j0
	
	if(dir == 1 ){i <- i-1}
	if(dir == 2 ){i <- i-1; j <- j+1}
	if(dir == 3 ){j <- j+1}
	if(dir == 4 ){i <- i+1; j <- j+1}
	if(dir == 5 ){i <- i+1}
	if(dir == 6 ){i <- i+1; j <- j-1}
	if(dir == 7 ){j <- j-1}
	if(dir == 8 ){i <- i-1; j <- j-1}
	
	if(i == 0){i <- 1}      #境界条件
	if(i == N+1){i <- N}
	if(j == 0){j <- 1}
	if(j == N+1){j <- 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)]))
	u[d]<-sum(u0)  #これが効いている数(自分の効きも含まれる)
	
	}
	i <- i0
	j <- j0
#自分の今いる場所(9の場所)に他のクイーンの効きがあるときは効きの少ないところへ移動する
#他のクイーンが効いていないとき(u[9]==4のとき)は動かない
	if(u[9] !=4){
	dir<-sample(c(which(u==min(u)),which(u==min(u))),1)
	if(dir == 1 ){i <- i-1}
	if(dir == 2 ){i <- i-1; j <- j+1}
	if(dir == 3 ){j <- j+1}
	if(dir == 4 ){i <- i+1; j <- j+1}
	if(dir == 5 ){i <- i+1}
	if(dir == 6 ){i <- i+1; j <- j-1}
	if(dir == 7 ){j <- j-1}
	if(dir == 8 ){i <- i-1; j <- j-1}	
	}	

	if(i == 0){i <- 1}      #境界条件
	if(i == N+1){i <- N}
	if(j == 0){j <- 1}
	if(j == N+1){j <- N}
			
	B[i,j]<-B[i,j]+1

	
					
	}			
	}
}
}
	if(min(A-B)==0){        #定常状態になったら終了
		image(A,col=topo.colors(20))
		break
		}else{
	A<-B              #次のステップへ
	B<-matrix(0,N,N)
	image(A,col=topo.colors(20))	
		}
			
}