zoukankan      html  css  js  c++  java
  • 【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 }
  • 相关阅读:
    微信小程序学习随笔
    SqlServer索引假脱机的解决
    web服务器出现大量CLOSE_WAIT连接的前因后果
    SqlServer和mysql字段拼接方法
    使用beego创建员工加班调休系统
    在c#程序中初步使用redis
    使用golang实现批量发送面试邀请邮件
    记c# rabbitmq的使用
    项目中使用mongodb的尝试
    手机集成支付宝支付功能的注意事项
  • 原文地址:https://www.cnblogs.com/helenawang/p/5469211.html
Copyright © 2011-2022 走看看