题意:
给一个n*m的地图,用k个管道全部覆盖,要求:每个管道长度不小于2,四联通,且每个格子只能被一个管道覆盖到,输出方案。
题解:
构造。
从左上角开始,向右铺,然后掉头向左铺,来回循环即可,前k-1个管道的长度都是2,然后第k个管道把剩下的都铺完就好了。
/****************
*PID:441c div2
*Auth:Jonariguez
*****************
*/
#define lson k*2,l,m
#define rson k*2+1,m+1,r
#define rep(i,s,e) for(i=(s);i<=(e);i++)
#define For(j,s,e) For(j=(s);j<(e);j++)
#define sc(x) scanf("%d",&x)
#define In(x) scanf("%I64d",&x)
#define pf(x) printf("%d",x)
#define pfn(x) printf("%d\n",(x))
#define Pf(x) printf("%I64d",(x))
#define Pfn(x) printf("%I64d\n",(x))
#define Pc printf(" ")
#define PY puts("YES")
#define PN puts("NO")
#include <stdio.h>
#include <string.h>
#include <string>
#include <math.h>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
typedef int Ll;
Ll quick_pow(Ll a,Ll b,Ll MOD){a%=MOD;Ll res=1;while(b){if(b&1)res=(res*a)%MOD;b/=2;a=(a*a)%MOD;}return res;}
const int maxn=300+10;
int a[maxn][maxn];
int main()
{
int i,j,n,m,k;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
int x=1,y=1,sign=1,cnt=0;
for(int v=1;v<=k;v++){
if(v<k){
printf("2");
printf(" %d %d",x,y);
y+=sign;
if(y>m){
x++;y=m;sign=-1;
}
if(y<=0){
x++;y=1;sign=1;
}
printf(" %d %d\n",x,y);
y+=sign;
if(y>m){
x++;y=m;sign=-1;
}
if(y<=0){
x++;y=1;sign=1;
}
cnt+=2;
}else {
printf("%d",n*m-cnt);
while(cnt<n*m){
printf(" %d %d",x,y);
y+=sign;
if(y>m){
x++;y=m;sign=-1;
}
if(y<=0){
x++;y=1;sign=1;
}
cnt++;
}
}
}
puts("");
}
return 0;
}