AOJ0141 Spiral Pattern
問題リンク Spiral Pattern
- 解法
(i, j)をぬろうとしたとき、(i, j)に隣接するマスが既に'#'だともう塗れないので方向を変えます(自分が来た方向のマスは除く)。方向を変えてもなお、次のマスが塗れなかったらそこで終了です。
移動ベクトルを使えばすっきりと書けると思います。
- ソース
import java.util.Arrays; import java.util.Scanner; //Spiral Pattern public class AOJ0141 { static char[][] s; static int n; static int[][] move = {{-1,0},{0,1},{1,0},{0,-1}}; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int t = sc.nextInt(); boolean f = true; while(t--!=0){ if(!f)System.out.println(); f = false; n = sc.nextInt(); s = new char[n][n]; for(int i=0;i<n;i++)Arrays.fill(s[i], ' '); int i = n; int j = 0; int k = 0; while(true){ int ni = i+move[k][0]; int nj = j+move[k][1]; if(0<=ni&&ni<n&&0<=nj&&nj<n&&c(ni,nj)){ s[ni][nj] = '#'; i = ni; j = nj; } else{ k = (k+1)%4; ni = i+move[k][0]; nj = j+move[k][1]; if(0<=ni&&ni<n&&0<=nj&&nj<n&&c(ni,nj)){ s[ni][nj] = '#'; i = ni; j = nj; } else break; } } for(int x=0;x<n;x++)System.out.println(new String(s[x])); } } static boolean c(int i, int j){ int c = 0; for(int k=0;k<4;k++){ int ni = i+move[k][0]; int nj = j+move[k][1]; if(0<=ni&&ni<n&&0<=nj&&nj<n&&s[ni][nj]=='#')c++; } return c<=1; } }