摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 失误原因(初次提交分数)
Valera and Tubes ★☆☆☆☆ 答案正确 100 2015-02-23 20:34:34 字母打错(0)

题意

在n*m的格子里放置k条管子,必需保证管子覆盖到每一个格子,且两条不同的管子不相邻,每条管子至少覆盖两个格子。

题解

如果k=1,容易得到S型的管子:

1  2  3  4
8  7  6  5
9  10 11 12
16 15 14 13

而k>1其实只要再去分割这个序列为k段即可,所以最简单的可以分n-1个长度为2的,剩下分一段即可。

代码

441C.cpp代码已折叠
展开折叠内容
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<queue>
#include<vector>
using namespace std;
#define f(i,n) for(int i=1;i<=n;++i)
#define fi(i,t,n)for(int i=t;i<=n;++i)
#define fd(i,n) for(int i=n;i>=1;--i)
#define fdi(i,t,n) for(int i=n;i>=t;--i)
#define foreach(i,s) for(typeof(s.begin()) i=s.begin();i!=s.end();++i)
#define rforeach(i,s) for(typeof(s.rbegin()) i=s.rbegin();i!=s.rend();++i)
#define si(n) scanf("%d",&n)
#define dsi(n) int n;scanf("%d",&n)
#define llu unsigned long long
#define lld long long
#define ci const int &
int a[100010],t=0,z=1,n,m,k;
void save(int x,int y)
{
    ++t;
    if(t%2==1)
    {
        if(t==1)
        {
            if(k!=1)//fixed:第一项特判//
            {
                cout<<"2 ";
                ++z;
            }
            else
            {
                cout<<n*m<<" ";
                z=3;
            }
        }
        else if(z==k)
        {
            cout<<endl<<n*m-t+1<<" ";
            ++z;
        }
        else if(z<k)//fixed:是k不是n//
        {
            cout<<endl<<"2 ";
            ++z;
        }
    }
    cout<<x<<' '<<y<<' ';
}
int main()
{
    cin>>n>>m>>k;
    for(int i=1;i<=n;++i)
        if(i&1)
            for(int j=1;j<=m;++j)
                save(i,j);
        else
            for(int j=m;j>=1;--j)
                save(i,j);
    return 0;
}

著作权声明[编辑]

关于[编辑]