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)) } }