switch関数

switchの使い方を教えてくれとNKが聞いてきたので書いてみる。
風邪気味だがしょうがない。だがしかし風邪であることをアピールしておけば女の子が家に来て看病してくれて熱い卵粥をフ〜フ〜して(ry
NKはN QUEEN問題というものをやっているようだ。そのプログラムのなかのif分岐をswitchでスマートに書くよ。

for(d in 1:9)

は、自分の位置(d=9)と自分の周囲(d=1:8)で条件分岐している。
これを正整数で書いているので

switch(dir,                             # 入るのは正整数。
       (i <- i-1),                      # if(dir == 1 ){i <- i-1}
       (i <- i-1) && (j <- j+1),        # if(dir == 2 ){i <- i-1; j <- j+1}
       (j <- j+1),                      # if(dir == 3 ){j <- j+1}
       (i <- i+1) && (j <- j+1),        # if(dir == 4 ){i <- i+1; j <- j+1}
       (i <- i+1),                      # if(dir == 5 ){i <- i+1}
       (i <- i+1) && (j <- j-1),        # if(dir == 6 ){i <- i+1; j <- j-1}
       (j <- j-1),                      # if(dir == 7 ){j <- j-1}
       (i <- i-1) && (j <- j-1)         # if(dir == 8 ){i <- i-1; j <- j-1}
      )

switchのなかに入ってないd=9とかいうやつらは、関数処理されずそのまま流される。
たぶんこれでいけると思う。

N<- 10
T<- 200
A<- B<- matrix(0,N,N)
A[sample(1:N^2,9)]<- 1 
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]){
          for(d in 1:9){
            dir <- d	
            i <- i0
            j <- j0
            switch(dir,(i <- i-1),                     
                       (i <- i-1) && (j <- j+1),       
                       (j <- j+1),                     
                       (i <- i+1) && (j <- j+1),      
                       (i <- i+1),                   
                       (i <- i+1) && (j <- j-1),      
                       (j <- j-1),                    
                       (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
          if(u[9] != 4){
            dir<- sample(c(rep(which(u==min(u)),times=10),1:8),1)
            switch(dir,(i <- i-1),                  
                       (i <- i-1) && (j <- j+1),     
                       (j <- j+1),                     
                       (i <- i+1) && (j <- j+1),      
                       (i <- i+1),                     
                       (i <- i+1) && (j <- j-1),       
                       (j <- j-1),                     
                       (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))	
   }
}