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;
    }
}
posted @ 2021-12-15 21:33  Eason_AC  阅读(44)  评论(0)    收藏  举报