题解:P7029 [NWRRC2017] Kotlin Island
fishing_cat
·
·
题解
题意
将 h \times w 的矩形切割成 n 块,且切割的部分也会占用面积,输出一种可行的方案。
思路
先观察每一行和每一列最多可分成多少个部分,然后由小学二年级的数学直觉可知,h 行和 w 列最多可以分出
所以可以直接枚举所有的小于 $$\left \lceil \frac{h}{2} \right \rceil$$ 的 $i$,看是否有可行的 $j$,如有可行的,就统计有几行几列为湿润的。在输出的时候,看现在的点所在行或列有没有被标记过就可以了。
### code
代码一点都不难写吧,还是不懂就看看吧。
```cpp
#include<bits/stdc++.h>
#define dl double
using namespace std;
/*快读省了*/
int h, w, n, k1, k2, hang[120], lie[120], key;
int main() {
read(h); read(w); read(n);
for (int i = 1; i <= ceil((dl)h/2); i++) { // 枚举 i
int j = n/i; // 由 i 直接求 j
if (j <= ceil((dl)w/2) && i * j == n) { // 是否整除(是否可行)
k1 = i - 1, k2 = j - 1; // 记录有几行几列为 "湿润的"
key = 1; break;
}
}
if (key == 0) // 没有可行方案
return puts("Impossible"), 0;
// 标记"湿润的"格
for (int i = 2, tot = 1; tot <= k1; i+=2, tot++)
hang[i] = 1;
for (int j = 2, tot = 1; tot <= k2; j+=2, tot++)
lie[j] = 1;
for (int i = 1; i <= h; i++) { // 输出
for (int j = 1; j <= w; j++) {
if (hang[i] == 1 || lie[j] == 1) printf("#");
else printf(".");
} puts("");
}
return 0;
}
```
### 闲话
建议评黄,感觉评橙也挺合适的。