A. 网格中的 MEX
每个测试的时间限制:2 秒
内存限制:256 兆字节
你手里有 n2 张卡片,上面的数值分别为 0 到 n2−1。
你需要将这些卡片放入一个 n×n 的网格中,每个格子恰好放一张卡片。
对于一个子网格,定义它的 MEX(最小排除值) 为没有出现在该子网格中的最小非负整数。
你的任务是摆放卡片,使得所有子网格的 MEX 之和最大。
子网格的总数为 (2n(n+1))2。
子网格的定义
一个 n×n 网格中的子网格由四个整数 l1,r1,l2,r2 确定,满足:
1≤l1≤r1≤n 且 1≤l2≤r2≤n。
网格中第 i 行第 j 列的元素属于该子网格当且仅当 l1≤i≤r1 且 l2≤j≤r2。
输入格式
第一行一个整数 t(1≤t≤100),表示测试数据组数。
每组数据第一行一个整数 n(1≤n≤500),表示网格边长。
保证所有测试数据的 n 之和不超过 1000。
输出格式
对于每组数据,输出 n 行,每行 n 个整数,表示网格的填法。
如果存在多种答案,输出任意一种即可。
示例
输入:
2
2
3
输出:
0 1
2 3
8 4 5
6 0 1
7 2 3
说明
在第一个测试数据中,一种有效的排列是:
01
23
总共有 9 个子网格,其中 4 个具有非零 MEX,如下所示:
- 子网格:[0](值:[0]) — MEX:1
- 子网格:[0,1](值:[0,1]) — MEX:2
- 子网格:[02](值:[0,2]) — MEX:1
- 子网格:[0213](值:[0,1,2,3]) — MEX:4
所有子网格的 MEX 之和为 1+2+1+4=8。
可以证明,没有其他排列能得到更大的 MEX 总和。