uvalive 7269

题意:将一块地板上铺满长度分别为1,2,3...n的蛇并且,奇数长度的蛇必须要有奇数个转折点,偶数长度的蛇必须要有偶数个转折点。求铺放方式,如果不能放,则输出0 0

思路:看了这个序列基本就懂了

1


1 2 2


1 3 2

3 3 2


1 3 2 4 4

3 3 2 4 4


1 3 5 2 2 6 6

3 3 5 4 4 6 6

5 5 5 4 4 6 6


1 3 5 7 2 4 4

3 3 5 7 2 4 4

5 5 5 7 6 6 6

7 7 7 7 6 6 6 


看了这个基本就能懂了,不会有不可能的情况,偶数个都是转两次就可以了,只需要判断好偶数的放置方式就行了,有一个坑的地方就是,输出那些蛇的时候,那些点必须是连着的。。。

#include
#include
#include
#include
#include
using namespace std;
const int maxn = 1010;
struct node
{
    int x,y;
    node(int x,int y):x(x),y(y){}
};
vector v[maxn];
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i = 1;i <= maxn;i++)
        v[i].clear();
        for(int i = 1;i <= n;i+=2)
        {
            for(int j = 1;j*2-1 < i;j++)
                v[i].push_back(node((i+1)/2,j));
            v[i].push_back(node((i+1)/2,(i+1)/2));
            for(int j = (i+1)/2-1;j>=1;j--)
                v[i].push_back(node(j,(i+1)/2));
        }
        int num = ((n-1)/2);
        if(num&1)
        {
            for(int i = 2;i <= n;i+=4)
            {
                for(int k = 1;k <= i/2;k++)
                    v[i].push_back(node(i/2,k+(n+1)/2));
                for(int k = i/2;k >=1;k--)
                    v[i].push_back(node(i/2+1,k+(n+1)/2));
            }
            for(int i = 4;i <= n;i+=4)
            {
                for(int k = 1;k <= i/2;k++)
                    v[i].push_back(node(k,i/2+(n+1)/2));
                for(int k = i/2;k >= 1;k--)
                    v[i].push_back(node(k,i/2+1+(n+1)/2));
            }
        }
        else
        {
            for(int i = 4;i <= n;i+=4)
            {
                for(int k = 1;k <= i/2;k++)
                    v[i].push_back(node(i/2,k+(n+1)/2));
                for(int k = i/2;k >=1;k--)
                    v[i].push_back(node(i/2+1,k+(n+1)/2));
            }
            for(int i = 2;i <= n;i+=4)
            {
                for(int k = 1;k <= i/2;k++)
                    v[i].push_back(node(k,i/2+(n+1)/2));
                for(int k = i/2;k >= 1;k--)
                    v[i].push_back(node(k,i/2+1+(n+1)/2));
            }
        }
        int all = n*(n+1)/2;
        int x = (n+1)/2;
        int y = all/x;
        printf("%d %d\n",x,y);
        for(int i = 1;i <= n;i++)
        {
            for(int j = 0;j < v[i].size();j++)
            {
                printf("%d %d%c",v[i][j].x,v[i][j].y,(j == v[i].size()-1)?'\n':' ');
            }
        }
    }
    return 0;
}

你可能感兴趣的:(UVALive)