题目大意
有一个 n × m n×m n×m 的矩形网格。
定义“管道”如下:
是一些格子组成的序列 序列长度至少为 2 2 2。
序列中任意相邻两个格子必须在网格中也相邻(四联通),
序列中不能出现重复的格子,
现在要给出 k k k 个管道使得每个格子恰好属于一个管道。
思路
首先,这题需要提供一种方法,使每个管道有且不少与 2 2 2 个格子,且每个格子必须相连。
这里题目的图片给了我们很多启发:
没错,前 k − 1 k - 1 k−1 个管子都只联通 2 2 2 个格子,总体呈蛇形。最后一个管子联通剩下所有管子 。
代码
(本代码相较于其他题解较为繁琐,建议参考其他题解)
#include<bits/stdc++.h>
using namespace std;
int main() {
int a,b,c;
cin>>b>>a>>c;
int x = 1,y = 1;
bool k = 1;
for(int i = 1;i <= c;i++){
if(i != c){
cout<<"2 ";
cout<<y<<" "<<x;
if(k == 1){
x++;
}
else{
x--;
}
if(x > a){
x--;
y++;
k = 0;
}
if(x < 1){
x++;
y++;
k = 1;
}
cout<<" "<<y<<" "<<x;
if(k == 1){
x++;
}
else{
x--;
}
if(x > a){
x--;
y++;
k = 0;
}
if(x < 1){
x++;
y++;
k = 1;
}
}
else{
cout<<(a * b - (c - 1) * 2);
for(int j = 1;j <= a * b - (c - 1) * 2;j++){
cout<<" "<<y<<" "<<x;
if(k == 1){
x++;
}
else{
x--;
}
if(x > a){
x--;
y++;
k = 0;
}
if(x < 1){
x++;
y++;
k = 1;
}
}
}
cout<<endl;
}
}