uvalive 7269

来源:互联网 发布:数控铣床简单编程实例 编辑:程序博客网 时间:2024/04/29 19:33

题意:将一块地板上铺满长度分别为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<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std;const int maxn = 1010;struct node{    int x,y;    node(int x,int y):x(x),y(y){}};vector<node> 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;}

0 0