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整除。
1 #include <cstdio> 2 using namespace std; 3 int n; 4 int H, W; 5 6 void printOdd(int x, int y){ 7 printf("%d %d ", x, y); 8 } 9 10 void printEven(int x, int y){ 11 printf("%d %d ", x, y+H); 12 } 13 14 int main(){ 15 while(~scanf("%d", &n)){ 16 H = (n+1)/2; 17 W = n&1 ? n : n+1; 18 printf("%d %d ", H, W); 19 for(int i=1; i<=n; i++){ 20 if(i&1){ 21 int x = H, y = H - i/2; 22 while(x > y){ 23 printOdd(x, y); 24 x--; 25 } 26 printOdd(x, y); 27 y++; 28 while(y <= H){ 29 printOdd(x, y); 30 y++; 31 } 32 }else{ 33 if(n%4==0 || (n+1)%4==0){ 34 int len = i/2; 35 if(i%4 == 0){ 36 int x = H, y = i/2; 37 while(x > H - len + 1){ 38 printEven(x, y); 39 x--; 40 } 41 printEven(x, y); 42 y++; 43 while(x <= H){ 44 printEven(x, y); 45 x++; 46 } 47 }else { 48 int x = H - i/2 + 1, y = 1; 49 while(y < len){ 50 printEven(x, y); 51 y++; 52 } 53 printEven(x, y); 54 x--; 55 while(y >= 1){ 56 printEven(x, y); 57 y--; 58 } 59 } 60 }else{ 61 int len = i/2; 62 if(i%4 == 0){ 63 int x = H - i/2 + 1, y = 1; 64 while(y < len){ 65 printEven(x, y); 66 y++; 67 } 68 printEven(x, y); 69 x--; 70 while(y >= 1){ 71 printEven(x, y); 72 y--; 73 } 74 }else{ 75 int x = H, y = i/2; 76 while(x > H - len + 1){ 77 printEven(x, y); 78 x--; 79 } 80 printEven(x, y); 81 y++; 82 while(x <= H){ 83 printEven(x, y); 84 x++; 85 } 86 } 87 } 88 } 89 printf(" "); 90 } 91 } 92 return 0; 93 }