import java.util.*;

class MultiArrEx2 {
	public static void main(String[] args) {
		final int SIZE = 5;
		int num = 0;
		int[][] bingo = new int[SIZE][SIZE];
		Scanner scanner = new Scanner(System.in);

		initBingo(bingo); // 배열의 모든 요소를 1부터 SIZE*SIZE까지의 숫자로 초기화
		shuffle(bingo); // 빙고판(bingo)안의 모든 요소의 위치를 임의로 바꾼다.
		// initTest(bingo); // 테스트할 수 있게 빙고판을 설정한다.

		do {
			printBingo(bingo); // 빙고판을 출력한다.
			System.out.printf("1~%d의 숫자를 입력하세요. 빙고:%d(종료:0)>", SIZE * SIZE, checkBingo(bingo));
			num = getUserInput(scanner); // 사용자로 부터 값을 입력받는다.
			findNum(num, bingo); // 입력받은 숫자와 같은 숫자가 저장된 요소를 찾아서 0을 저장
		} while (num != 0);
	} // main의 끝

	private static int getUserInput(Scanner s) {
		String tmp = s.nextLine(); // 화면에서 입력받은 내용을 tmp에 저장
		return Integer.parseInt(tmp); // 입력받은 문자열(tmp)를 숫자로 변환
	}

	private static void findNum(int num, int[][] bingo) {
		outer: for (int i = 0; i < bingo.length; i++) {
			for (int j = 0; j < bingo[i].length; j++) {
				if (bingo[i][j] == num) {
					bingo[i][j] = 0;
					break outer; // 2중 반복문을 벗어난다.
				}
			}
		}
	}

	private static void printBingo(int[][] bingo) {
		for (int i = 0; i < bingo.length; i++) {
			for (int j = 0; j < bingo[i].length; j++)
				System.out.printf("%2d ", bingo[i][j]);
			System.out.println();
		}
		System.out.println();
	}

	private static void initBingo(int[][] bingo) {
		for (int i = 0; i < bingo.length; i++) {
			for (int j = 0; j < bingo[i].length; j++) {
				bingo[i][j] = i * bingo.length + j + 1;
			}
		}
	}

	private static void shuffle(int[][] bingo) {
		// 배열에 저장된 값을 뒤섞는다.(shuffle)
		for (int i = 0; i < bingo.length; i++) {
			for (int j = 0; j < bingo[i].length; j++) {
				int x = (int) (Math.random() * bingo.length);
				int y = (int) (Math.random() * bingo.length);

				// bingo[i][j]와 임의로 선택된 값(bingo[x][y])을 바꾼다.
				int tmp = bingo[i][j];
				bingo[i][j] = bingo[x][y];
				bingo[x][y] = tmp;
			}
		}
	}

	private static int checkBingo(int[][] bingo) {
		// bingo체크
		int gCnt = 0; // 가로 빙고체크를 위한 변수
		int sCnt = 0; // 세로 빙고체크를 위한 변수
		int cCnt = 0; // 대각선 빙고체크를 위한 변수
		int cCnt2 = 0; // 반대 대각선 빙고 체크를 위한 변수

		int bingoCnt = 0;

		for (int i = 0; i < bingo.length; i++) {
			gCnt = 0;
			sCnt = 0;
			for (int j = 0; j < bingo.length; j++) {
				if (bingo[i][j] == 0)
					gCnt++;
				if (bingo[j][i] == 0)
					sCnt++;
				if (i == j && bingo[i][j] == 0)
					cCnt++;
				if (i + j == 4 && bingo[i][j] == 0)
					cCnt2++;
			}
			if (gCnt == 5)
				bingoCnt++;
			if (sCnt == 5)
				bingoCnt++;
		}
		if (cCnt == 5)
			bingoCnt++;
		if (cCnt2 == 5)
			bingoCnt++;

		return bingoCnt;
	}

	private static void initTest(int[][] bingo) {
		for (int i = 0; i < bingo.length; i++)
			for (int j = 0; j < bingo[i].length; j++)
				bingo[i][j] = 0;

		bingo[0][0] = 1;
	}
}