题意:
给你n条蛇,长度分别为(1~n)的蛇,要求将蛇摆放之后形成一个矩形,并且得保证除了1的长度为奇数的蛇拐弯也为正奇数次,除了2以外的长度为偶数的蛇拐弯也为正偶数次。
首先,对于奇数的蛇,可以用3包住1,5包住3这个方式先形成一个正方形。在将剩余的偶数的蛇组成一个有一个边长度和正方形相同的长方形之后将两个图形连接起来即可。
需要注意的是对于长方形的长度是奇数还是偶数,偶数的蛇的摆放时不同的。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <vector>
#include <iostream>
#define N 520
using namespace std;
typedef long long ll;
struct NODE
{
int x,y;
};
vector<NODE>v[N];
int a[N];
int main()
{
int n;
int ans_n,ans_m;
int i,j=1,k,len,len_num;
int flag,flag_1;
int num_1,num_2;
NODE tmp;
while(scanf("%d",&n)!=EOF)
{
flag=0;len=0;
for(i=1;i<=n;i++)
v[i].clear();
ans_n=ans_m=0;
if(n%2==0)
{
n--;
flag=1;
}
for(i=1;i<=n;i++)
{
if(i%2==1)
{
ans_n++;
for(j=1;j<=ans_n;j++)
{
tmp.x=ans_n;tmp.y=j;
v[i].push_back(tmp);
}
for(j=ans_n-1;j>=1;j--)
{
tmp.x=j;tmp.y=ans_n;
v[i].push_back(tmp);
}
}
else
a[len++]=i;
}
ans_m=ans_n;
if(len%2==0)
{
for(i=0,j=len-1;i<=j;i++,j--)
{
num_1=a[i];
num_2=a[j];
if(a[i]!=a[j])
{
ans_m+=2;
len_num=0;k=1;flag_1=0;
while(len_num<num_1)
{
if(!flag_1)
{
tmp.x=k;tmp.y=ans_m-1;
v[num_1].push_back(tmp);
tmp.x=k;tmp.y=ans_m;
v[num_1].push_back(tmp);
len_num+=2;
flag_1=1;k++;
}
else
{
tmp.x=k;tmp.y=ans_m;
v[num_1].push_back(tmp);
tmp.x=k;tmp.y=ans_m-1;
v[num_1].push_back(tmp);
len_num+=2;
flag_1=0;k++;
}
}
len_num=0;flag_1=0;
while(len_num<num_2)
{
if(!flag_1)
{
tmp.x=k;tmp.y=ans_m-1;
v[num_2].push_back(tmp);
tmp.x=k;tmp.y=ans_m;
v[num_2].push_back(tmp);
len_num+=2;
flag_1=1;k++;
}
else
{
tmp.x=k;tmp.y=ans_m;
v[num_2].push_back(tmp);
tmp.x=k;tmp.y=ans_m-1;
v[num_2].push_back(tmp);
len_num+=2;
flag_1=0;k++;
}
}
}
}
}
else
{
int fange=1;
for(i=0,j=len-2;i<=j;i++,j--)
{
num_1=a[i];
num_2=a[j];
if(num_1!=num_2)
{
k=ans_n+1;
len_num=0;flag_1=0;
while(len_num<num_1)
{
if(!flag_1)
{
tmp.x=fange;tmp.y=k;
v[num_1].push_back(tmp);
tmp.x=fange+1;tmp.y=k;
v[num_1].push_back(tmp);
len_num+=2;
flag_1=1;k++;
}
else
{
tmp.x=fange+1;tmp.y=k;
v[num_1].push_back(tmp);
tmp.x=fange;tmp.y=k;
v[num_1].push_back(tmp);
len_num+=2;
flag_1=0;k++;
}
}
len_num=0;flag_1=0;
while(len_num<num_2)
{
if(!flag_1)
{
tmp.x=fange;tmp.y=k;
v[num_2].push_back(tmp);
tmp.x=fange+1;tmp.y=k;
v[num_2].push_back(tmp);
len_num+=2;
flag_1=1;k++;
}
else
{
tmp.x=fange+1;tmp.y=k;
v[num_2].push_back(tmp);
tmp.x=fange;tmp.y=k;
v[num_2].push_back(tmp);
len_num+=2;
flag_1=0;k++;
}
}
fange+=2;
}
}
num_1=a[len-1];
ans_m+=num_1/2;
for(j=ans_n+1;j<=ans_m;j++)
{
tmp.x=fange;tmp.y=j;
v[num_1].push_back(tmp);
}
for(j=ans_m;j>=ans_n+1;j--)
{
tmp.x=fange+1;tmp.y=j;
v[num_1].push_back(tmp);
}
}
if(flag)
{
n++;
ans_m+=2;
for(k=1;k<=ans_n;k++)
{
tmp.x=k;tmp.y=ans_m-1;
v[n].push_back(tmp);
}
for(k=ans_n;k>=1;k--)
{
tmp.x=k;tmp.y=ans_m;
v[n].push_back(tmp);
}
}
printf("%d %d\n",ans_n,ans_m);
for(i=1;i<=n;i++)
{
len=v[i].size();
for(j=0;j<len;j++)
{
printf("%d %d",v[i][j].x,v[i][j].y);
if(j==len-1)
printf("\n");
else
printf(" ");
}
}
}
return 0;
}