import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Snail {
static int N;
static int answer;
static int[][] map;
static int dr[] = {-1,0,1,0};
static int dc[] = {0,1,0,-1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
answer = Integer.parseInt(br.readLine());
map = new int[N + 1][N + 1];
int num = N / 2 + 1;
dfs(num,num,1,3);
int row=0;
int col = 0;
StringBuilder sb = new StringBuilder();
for (int i = 1; i < N+1; i++) {
for (int j = 1; j < N+1; j++) {
sb.append(map[i][j]).append(" ");
if(map[i][j]==answer){
row =i;
col = j;
}
}
sb.append("\n");
}
System.out.print(sb);
System.out.println(row+" "+col);
}
public static void dfs(int row, int col,int count,int dir){
map[row][col] = count;
int ndir = (dir+1)%4;
if(map[row+dr[ndir]][col+dc[ndir]]==0) {
dir = ndir;
}
row += dr[dir];
col += dc[dir];
if(row<1||col<1||row>=N+1||col>=N+1)
return;
dfs(row,col,count+1,dir);
}
}
달팽이는 위,오,아,왼 순으로 움직인다. 해당 순서대로 방향을 바꿔주며, 언제 방향을 유지할지, 언제 방향을 다음방향으로 바꿀지를 기준으로 설계한다.
풀면서 보니까 그렇게 어려운 풀이는 아닌거 같은데, 방향을 어떤식으로 바꿔줘야할지 설계하는데 어려웠다.
그리고 마지막에 출력시 system.out.println()으로 출력하면 시간초과가 나는데, StringBuilder()로 출력하면 통과가 된다.
StringBuilder가 빠른지 알게 되었다.