• 【hihocoder 1257 Snake Carpet】构造


    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 }
  • 相关阅读:
    常见DOS命令总结
    常见DOS命令总结
    HDU 6119 小小粉丝度度熊【线段合并+尺取法】(2017"百度之星"程序设计大赛
    HDU 6119 小小粉丝度度熊【线段合并+尺取法】(2017"百度之星"程序设计大赛
    【数论】——逆元
    【数论】——逆元
    需要了解的几个Java基础点
    TreeMap读源码总结
    Reactor模式
    Maven常见问题总结
  • 原文地址:https://www.cnblogs.com/helenawang/p/5469211.html
Copyright © 2020-2023  润新知