您的位置:首页 > 其它

【hihocoder 1257 Snake Carpet】构造

2016-05-07 21:13 393 查看
2015北京区域赛现场赛第4题。

题面:http://media.hihocoder.com/contests/icpcbeijing2015/problems.pdf

OJ链接:http://hihocoder.com/problemset/problem/1257

题意:长度依次为1到N的N条蛇,平铺在一个地毯上,互不相交,要求每条长度为奇数(偶数)的蛇恰好有奇数(偶数)个拐点,1、2除外。求可行的构造方案。

我的构造方法如下:



奇偶数分开,奇数始终保持L型向外扩展,偶数保持两行(列)和已有的块拼接。

注意偶数部分每隔2组进行一次90度的旋转,代码体现为判N是否能被4整除。

#include <cstdio>
using namespace std;
int n;
int H, W;

void printOdd(int x, int y){
printf("%d %d ", x, y);
}

void printEven(int x, int y){
printf("%d %d ", x, y+H);
}

int main(){
while(~scanf("%d", &n)){
H = (n+1)/2;
W = n&1 ? n : n+1;
printf("%d %d\n", H, W);
for(int i=1; i<=n; i++){
if(i&1){
int x = H, y = H - i/2;
while(x > y){
printOdd(x, y);
x--;
}
printOdd(x, y);
y++;
while(y <= H){
printOdd(x, y);
y++;
}
}else{
if(n%4==0 || (n+1)%4==0){
int len = i/2;
if(i%4 == 0){
int x = H, y = i/2;
while(x > H - len + 1){
printEven(x, y);
x--;
}
printEven(x, y);
y++;
while(x <= H){
printEven(x, y);
x++;
}
}else {
int x = H - i/2 + 1, y = 1;
while(y < len){
printEven(x, y);
y++;
}
printEven(x, y);
x--;
while(y >= 1){
printEven(x, y);
y--;
}
}
}else{
int len = i/2;
if(i%4 == 0){
int x = H - i/2 + 1, y = 1;
while(y < len){
printEven(x, y);
y++;
}
printEven(x, y);
x--;
while(y >= 1){
printEven(x, y);
y--;
}
}else{
int x = H, y = i/2;
while(x > H - len + 1){
printEven(x, y);
x--;
}
printEven(x, y);
y++;
while(x <= H){
printEven(x, y);
x++;
}
}
}
}
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: