canuc80k2905·6/50

Ma Trận Không Kề Nhau

Nộp bài trên LQDOJ

Bài 29 · Constructive Algorithms

Hai số nguyên được gọi là liên tiếp nếu hiệu tuyệt đối của chúng bằng . Hai ô trong một ma trận được gọi là kề nhau nếu chúng có chung một cạnh.

Với mỗi số nguyên , hãy điền các số từ đến vào một ma trận vuông , mỗi số xuất hiện đúng một lần, sao cho hai ô kề nhau không bao giờ chứa hai số liên tiếp. Nếu có nhiều ma trận hợp lệ, bạn có thể in bất kỳ ma trận nào.

Input

  • Dòng đầu chứa số nguyên - số bộ test.
  • Mỗi bộ test gồm một dòng chứa số nguyên .

Output

  • Với mỗi bộ test, in trên một dòng nếu không tồn tại ma trận hợp lệ.
  • Ngược lại, in dòng, mỗi dòng gồm số nguyên mô tả một ma trận thỏa mọi điều kiện. Các bộ test được in liên tiếp; không bắt buộc có dòng trống ngăn cách.

Constraints

  • .
  • .
  • Mỗi số từ đến phải xuất hiện đúng một lần trong đáp án khác .

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

4
1
2
3
4

Output

1
-1
1 3 5
7 9 2
4 6 8
1 3 5 7
9 11 13 15
2 4 6 8
10 12 14 16

Giải thích: Với không có cách đặt đủ bốn số nên kết quả là . Ở hai ma trận còn lại, các số lẻ được đặt trước các số chẵn; mọi cặp ô chung cạnh đều có hiệu khác .

Lời giải tóm tắt
  • Ý tưởng: Trường hợp n=1 chỉ cần in 1, còn n=2 không có đáp án.
  • Ý tưởng: Với n≥3, lập một dãy gồm toàn bộ số lẻ tăng dần rồi toàn bộ số chẵn tăng dần, sau đó điền dãy theo thứ tự hàng. Hai số cùng parity luôn cách nhau một số chẵn ít nhất 2; các cặp nằm qua ranh giới hai nhóm cũng không thể hơn kém nhau đúng 1 khi n≥3. Dãy chứa mỗi số từ 1 đến n² đúng một lần nên ma trận là một hoán vị hợp lệ.
  • Ý tưởng: Thuật toán chạy trong O(n²) thời gian và dùng O(n²) bộ nhớ.