构造题,

题意

n条蛇,第i条长度为i,编号为奇数必须有奇数个转折点,编号为偶数必须有偶数个转折点,密铺一个矩形

输出矩形长宽,并依次输出每条蛇坐标

$n<=500$

题解

找规律,

首先根据等差数列,当$n$为奇数矩形长为$frac{n+1}{2}$宽为$n$当$n$为偶数,矩形长为$frac{n}{2}$宽为$n$

当$n$为偶数$n$这条蛇直接在前面基础上往右摞就完了

x     x     x     x     x    n    n

x     x     x     x     x    n    n

x     x     x     x     x    n    n

当$n$为奇数要找规律,往下摞最后规律是这样的

x     x     x     x     x     n-2 n

x     x     x     x     x     n-2 n

n-1 n-1 n-1 n-2 n-2   n-2 n

n-1 n-1 n-1  n    n      n    n

#include<bits/stdc++.h>
using namespace std;
#define ll long long
void f(ll n){
    ll nowx,nowy,lie,hang,num;
    if(n&1) nowx=(n+1)/2,nowy=n;
    else nowx=n/2,nowy=n+1;
    if(n==2){
        printf("1 1
");
        printf("1 2 1 3
");
        return ;
    }
    if(n==3){
        printf("2 1
");
        printf("1 1 1 2
");
        printf("1 3 2 3 2 2
");
        return ;
    }
    if(n&1){
        f(n-3);
        hang=(n-3)/2;
        lie=n-2;
        num=(n-1)/2;
        //n-2
        for(ll i=1;i<=num;i++)
            printf("%lld %lld ",i,lie+1);
        for(ll i=0;i<num-1;i++)
            printf("%lld %lld ",hang+1,lie-i);
        puts("");
        //n-1
        for(ll i=1;i<=num;i++)
            printf("%lld %lld ",hang+1,i);
        for(ll i=num;i>=1;i--)
            printf("%lld %lld ",hang+2,i);
        puts("");
        //n
        for(ll i=1;i<=num+1;i++)
            printf("%lld %lld ",i,lie+2);
        for(ll i=0;i<num;i++)
            printf("%lld %lld ",hang+2,lie-i+1);
        puts("");
    }
    else {
        f(n-1);
        hang=(n+1)/2,lie=n-1;
        //n
        for(ll i=1;i<=hang;i++)
            printf("%lld %lld ",i,lie+1);
        for(ll i=hang;i>=1;i--)
            printf("%lld %lld ",i,lie+2);
        puts("");
    }
}
ll d;
int main(){
    ll x,y;
    while(cin>>d){
        if(d&1){
            x=(d+1)/2,y=d;
        }
        else x=d/2,y=d+1;
        printf("%lld %lld
",x,y);
        f(d);
    }
}
View Code
原文地址:https://www.cnblogs.com/znsbc-13/p/11664725.html