Problem:
タイル (Tile)

問題

JOI 高校では， 1 × 1 の正方形のタイルを使って N × N の正方形の壁画を作り，文化祭で展示することになった．タイルの色は，赤，青，黄の 3 種類である．壁画のデザインは次の通りである．まず，最も外側の周に赤のタイルを貼り，その内側の周に青のタイルを貼る．さらにその内側の周に黄色のタイルを貼る．これを N × N の正方形が埋め尽くされるまで繰り返す．用いるタイルの色は，一番外側の周から順番に赤，青，黄，赤，青，黄，…である．

文化祭が近づいてきたある日，壁画のうち K 枚のタイルがはがれていることが判明した．そこで，新しいタイルを購入して，はがれた箇所に新しいタイルを貼ることにした．

入力として壁画の一辺の長さ N と，はがれたタイルの枚数 K， K 枚のはがれたタイルの位置が与えられたとき，はがれたタイルの色を求めるプログラムを作成せよ．

例えば，N = 11 の場合，11 × 11 の壁画のデザインは下図の通りである．

また，N = 16 の場合，16 × 16 の壁画のデザインは下図の通りである．

入力

入力は全部で 2+K 行からなる． 1 行目には，壁画の一辺の長さ N （1 ≤ N ≤ 1000000000 = 109）が， 2 行目には，はがれたタイルの枚数 K （1 ≤ K ≤ 1000）が書かれている． 2+i 行目（1 ≤ i ≤ K）には，2 つの整数 ai と bi （1 ≤ ai ≤ N, 1 ≤ bi ≤ N）が空白区切りで書かれており， i 枚目のはがれたタイルが，左から ai 列目，上から bi 行目のタイルであることを表す．

入力の 3 行目から 2+K 行目には同じタイルを表す行が重複して現れることはない．また，与えられる入力データ 40% では， N ≤ 1000 をみたしている．

出力

出力は K 行からなる．各行は 1 つの整数からなり， i 行目（1 ≤ i ≤K）の整数は，i 枚目のはがれたタイルが赤のときは 1 を，青のときは 2 を，黄色のときは 3 を表す．

入出力例

入力例 1

11
4
5 2
9 7
4 4
3 9

出力例 1

2
3
1
3

入力例 2

16
7
3 7
5 2
11 6
15 2
9 7
8 12
15 16

出力例 2

3
2
3
2
1
2
1

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in JAVA (judge verdict: Accepted)


import java.io.*;
import java.util.*;


// 2011/10/24 
// 44 27.672

// 0556 Tile
public class Main {

	int[] roundR(int[] cube) {
		int[] newCube = new int[6];
		System.arraycopy(cube, 0, newCube, 0, 6);
		newCube[0] = cube[1];
		newCube[1] = cube[5];
		newCube[5] = cube[4];
		newCube[4] = cube[0];
		return newCube;
	}
	
	int[] roundU(int[] cube) {
		int[] newCube = new int[6];
		System.arraycopy(cube, 0, newCube, 0, 6);
		newCube[1] = cube[2];
		newCube[2] = cube[4];
		newCube[4] = cube[3];
		newCube[3] = cube[1];
		return newCube;
	}
	
	// L[u 24Ï»
	int[] change(int[] cube, int n) {
	
		int men = n / 4;
		if (men == 0) {
			;
		}
		else if (men == 1) {
			cube = roundR(cube);
		}
		else if (men == 2) {
			cube = roundR(cube);
			cube = roundR(cube);
		}
		else if (men == 3) {
			cube = roundR(cube);
			cube = roundR(cube);
			cube = roundR(cube);
		}
		else if (men == 4) {
			cube = roundU(cube);
			cube = roundR(cube);
		}
		else {
			cube = roundU(cube);
			cube = roundR(cube);
			cube = roundR(cube);
			cube = roundR(cube);
		}
		
		for(int i = 0; i < n % 4; i++) {
			cube = roundU(cube);
		}
		return cube;
	}
	
	// 2ÂÌL[uª¯¶©Ç¤©
	boolean equals(int[] cube1, int[] cube2) {
		
		for(int i = 0; i < 24; i++) {
			int[] c = change(cube1, i);
			boolean b = Arrays.equals(c, cube2);
			if (b)
				return true;
		}
		return false;
	}
	

	// C return falseÅ¨µÜ¢
	boolean main() throws IOException {

		int N = readIntArray()[0];
		//if (n == 0)
		//	return false;
		
		int K = readIntArray()[0];

		for(int i = 0; i < K; i++) {
			int[] ir = readIntArray();
			int x = ir[0] - 1;
			int y = ir[1] - 1;
			if (x >= N / 2) {
				x = N - 1- x;
			}
			if (y >= N / 2) {
				y = N - 1 - y;
			}
			int c = (Math.min(x, y) % 3) + 1;
			
			System.out.printf("%d\n", c);
		}
		
		
		return false;
//		return true; // ³íI¹ Ö
	}
	

//	private final static boolean DEBUG = true;  // debug
	private final static boolean DEBUG = false; // release

	public static void main(String[] args) throws IOException {

		if (DEBUG) {
			log = System.out;
			
			String inputStr = "3:Cyan Yellow Red Magenta Green Blue:Cyan Yellow Red Magenta Green Blue:Red Yellow Magenta Blue Green Cyan:0:";

			inputStr = inputStr.replace(":", "\n");

			reader = new BufferedReader(new StringReader(inputStr)); 

		}
		else {
			log = new PrintStream(new OutputStream() { public void write(int b) {} } ); // «ÌÄ
			reader = new BufferedReader(new InputStreamReader(System.in)); // R\[©ç
		}
		
		int N = Integer.MAX_VALUE;
		//int N = readIntArray()[0];

		for(int i = 0; i < N; i++) {
			boolean b = new Main().main();
			if (!b)
				break;
		}		
		
		reader.close();
	}

	
	static PrintStream log;
	static BufferedReader reader;
	

	// WüÍæè1sªÌæØè¶æØèÅÌ®lðÇÞ
	// EOFÌêÍnullðÔ·
	private static int[] readIntArray() throws IOException {

		String s = null;
		for(;;) {
			s = reader.readLine();
//			log.printf("%s\n", s);
			if (s == null)
				return null;
			s = s.trim();
			if (s.length() != 0) // ¦¦¦@Ç¤àËRósðÇÞ±Æª éBÇÝòÎ·Æ¤Ü­¢­çµ¢BBBB
				break;
		}
		
		String[] sp = s.split("[ ,]"); // æØè¶ÍXy[X©J}
		int[] a = new int[sp.length];
		for(int i = 0; i < sp.length; i++) {
			a[i] = Integer.parseInt(sp[i]);
		}
		return a;
	}
		
}