• UVALive 7269 Snake Carpet (构造)


    题目:传送门

    题意:构造出一个矩阵,使得矩阵含有n条蛇,每条蛇的长度是1到n,并且奇数长度的蛇有奇数个拐弯,偶数长度

    的蛇有偶数个拐弯.

    奇数和偶数分开构造,奇数可以是:

    1357

    3357

    5557

    7777

    这样一直构造下去,偶数可以这样:

    2266

    4466

    4466

    8888

    8888

    不断的放右边和放下面.

    然后预处理每一个蛇的每一个坐标,然后考虑一下偶数的是放在奇数部分的右边还是下面.

    #include <bits/stdc++.h>
    using namespace std;
    #define maxn 1111
    
    struct point {
        int x, y;
    };
    vector <point> p[maxn];
    int n;
    
    void init () {
        for (int i = 1; i <= 1000; i++) {
            p[i].clear ();
        }
        for (int i = 1; i <= 1000; i++) {
            if (i&1) {
                int x = (i+1)/2;
                int y = x;
                for (int j = 1; j <= x; j++) {
                    p[i].push_back ((point) {x, j});
                }
                for (int j = x-1; j >= 1; j--) {
                    p[i].push_back ((point) {j, y});
                }
            }
            else {
                if (i == 2) {
                    p[2].push_back ((point) {1, 1});
                    p[2].push_back ((point) {1, 2});
                }
                else if ((i>>1)&1) {
                    int y = i>>1;
                    for (int j = 1; j <= y; j++) {
                        p[i].push_back ((point) {j, y});
                    }
                    for (int j = y; j >= 1; j--) {
                        p[i].push_back ((point) {j, y+1});
                    }
                }
                else {
                    int x = i>>1;
                    for (int j = 1; j <= x; j++) {
                        p[i].push_back ((point) {x, j});
                    }
                    for (int j = x; j >= 1; j--) {
                        p[i].push_back ((point) {x+1, j});
                    }
                }
            }
        }
    }
    
    int main () {
        init ();
        while (scanf ("%d", &n) == 1) {
            if (((n+1)/2)&1) {//偶数放在右边
                printf ("%d %d
    ", (n+1)>>1, (n/2)+(n/2)+1);
                for (int i = 1; i <= n; i++) {
                    for (int j = 0; j < p[i].size (); j++) {
                        if (i&1) {
                            printf ("%d %d%c", p[i][j].x, p[i][j].y, j == p[i].size()-1 ? '
    ':' ');
                        }
                        else {
                            printf ("%d %d%c", p[i][j].x, p[i][j].y+((n+1)>>1), j == p[i].size()-1 ? '
    ':' ');
                        }
                    }
                }
            }
            else {//偶数放在下面
                printf ("%d %d
    ", (n/2)+(n/2)+1, (n+1)>>1);
                for (int i = 1; i <= n; i++) {
                    for (int j = 0; j < p[i].size (); j++) {
                        if (i&1) {
                            printf ("%d %d%c", p[i][j].x, p[i][j].y, j == p[i].size()-1 ? '
    ':' ');
                        }
                        else {
                            printf ("%d %d%c", p[i][j].x+((n+1)>>1), p[i][j].y, j == p[i].size()-1 ? '
    ':' ');
                        }
                    }
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    MySQL之存储引擎
    MySQL之基础功能
    MySQL之正则表达式
    MySQL之数据类型
    MySQL之多表查询
    MySQL之单表查询
    linux命令useradd添加用户详解
    MySQL之数据操作
    MySQL之表操作
    MySQL之库操作
  • 原文地址:https://www.cnblogs.com/Ritchie/p/5742027.html
Copyright © 2020-2023  润新知