LuoguP7784 [AC6-M15] “大吊灯”攻略作战 题解
Content
你要把 \(n\times m\) 的一个矩阵划分成若干个矩阵,使得对于每一个矩阵:
- 不存在两个矩阵合起来是一个矩阵。
- 划分的矩阵个数不超过 \(10\)。
请给出一个划分方案,或者报告不存在。
数据范围:\(1\leqslant n,m\leqslant 1000\)。
Solution
ClCN 往第一题和最后一题放分别放了个签到题,真是别有用心啊(
回到正题,首先,显然如果 \(n=2\) 或者 \(m=2\),就不能够构造出一个方案满足上面的要求。
否则是可以构造的,下面给出一个划分的矩阵数为 \(5\) 的一个构造方案。
首先对于一个格子 \((x,y)\),如果 \(x\in[2,n-1]\) 且 \(y\in[2,m-1]\),则所有满足要求的格子可以组成一个矩阵。然后对于在边界上的格子,从 \((1,1)\) 开始到 \((n-1,1)\) 的一段为一个矩阵,从 \((n,1)\) 开始到 \((n,m-1)\) 的一段为一个矩阵,从 \((n,m)\) 到 \((2,m)\) 的一段为一个矩阵,从 \((1,m)\) 到 \((1,2)\) 的一段为一个矩阵。这样就可以构造出一个划分的矩阵数为 \(5\) 的满足要求的方案了。
Code
namespace Solution {
int a[1007][1007] = {0};
iv Main() {
int n = Rint, m = Rint;
if(n <= 2 || m <= 2) puts("-1");
else {
int curx = 1, cury = 1, curcol = 1;
while(curx < n) a[curx++][cury] = curcol;
curcol++;
while(cury < m) a[curx][cury++] = curcol;
curcol++;
while(curx > 1) a[curx--][cury] = curcol;
curcol++;
while(cury > 1) a[curx][cury--] = curcol;
F(int, i, 2, n - 1) F(int, j, 2, m - 1) a[i][j] = 5;
puts("5");
F(int, i, 1, n) print_array1(a[i], m);
}
return;
}
}

浙公网安备 33010602011771号