题目链接:http://codeforces.com/contest/441/problem/C
题目大意:有一个n*m的矩阵,你需要用k根管道填满这个矩形,管道只能横着或者直着放,不能斜着放。让你每行输出管道的经过点的坐标。因为有很多种放置方法,所以只需要输出满足条件的任意一种就行。
由于n, m, k (2 ≤ n, m ≤ 300; 2 ≤ 2k ≤ n·m),所以前面k-1根管道只需要占据两个点,最后一根管道蛇形轨迹即可,这样所有的情况都能满足。
#include <iostream>
#include <cstdio>
#define MAX_N 300
using namespace std;
int main()
{
#ifndef ONLINE_JUDGE
freopen("D:/out.txt","w",stdout);
#endif //ONLINE_JUDGE
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
int i=1;
int j=1;
bool s=true;
for(int p=1;p<k;p++)
{
printf("2");
for(int t=1;t<=2;t++)
{
if(!s&&t==2&&j==1)
{
printf(" %d %d",i++,j);
s=true;
}
else if(s&&t==2&&j==m)
{
printf(" %d %d",i++,j);
s=false;
}
else if(s&&t==1&&j==m)
{
printf(" %d %d",i++,j);
s=false;
}
else if(s)
{
printf(" %d %d",i,j);
j++;
}
else
{
printf(" %d %d",i,j);
j--;
}
}
printf("\n");
}
printf("%d ",n*m-(k-1)*2);
for(;i<=n;i+=2)
{
if(s)
{
for(;j<=m;j++)
printf("%d %d ",i,j);
j--;
if(i<n)
{
for(;j>=1;j--)
printf("%d %d ",i+1,j);
}
j++;
}
else
{
for(;j>=1;j--)
{
printf("%d %d ",i,j);
}
j++;
if(i<n)
{
for(;j<=m;j++)
printf("%d %d ",i+1,j);
}
j--;
}
}
return 0;
}