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", (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 ? ‘\n‘:‘ ‘);
                    }
                    else {
                        printf ("%d %d%c", p[i][j].x, p[i][j].y+((n+1)>>1), j == p[i].size()-1 ? ‘\n‘:‘ ‘);
                    }
                }
            }
        }
        else {//偶数放在下面
            printf ("%d %d\n", (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 ? ‘\n‘:‘ ‘);
                    }
                    else {
                        printf ("%d %d%c", p[i][j].x+((n+1)>>1), p[i][j].y, j == p[i].size()-1 ? ‘\n‘:‘ ‘);
                    }
                }
            }
        }
    }
    return 0;
}
时间: 2024-10-02 02:34:54

UVALive 7269 Snake Carpet (构造)的相关文章

LA 7269 Snake Carpet (找规律,模拟)

题意:给定一个数字n,表示有n条蛇,然后蛇的长度是 i ,如果 i 是奇数,那么它只能拐奇数个弯,如果是偶数只能拐偶数个,1, 2除外,然后把这 n 条蛇, 放到一个w*h的矩阵里,要求正好放满,让你输出一个解,如果没有,输出0 0. 析:这个题目是找规律,先画一下前几个,画到第7个,就应该能找到规律,假设现在是第6个,并且是最后一个了,那么我们就可以在第5个基础上,在矩阵的 右边放上两列,正好是6,而且拐弯为偶数,如果是要放到7,那么就可以这样放,把第7条,放到第4行到第六列再向上一个,正好是

构造 hihocoder 1257 Snake Carpet (15北京I)

题目传送门 题意:贪吃蛇,要求长度奇数的蛇转弯次数为正奇数,长度偶数转弯次数为正偶数,且组成矩形.(北大出的题咋都和矩形相关!!!) 分析:构造找规律,想到就简单了.可以构造 宽:(n + 1) / 2, 长(n + 1) * n / 2 / (n + 1) / 2的矩形; n = 5 1 2 4 4 53 2 4 4 53 3 5 5 5 n = 7 1 2 4 4 5 6 63 2 4 4 5 6 63 3 5 5 5 7 67 7 7 7 7 7 6 n = 8 1 2 4 4 5 6 6

hihoCoder 1257 Snake Carpet(很简单的构造方法)

2015 ACM / ICPC 北京现场赛 I 题 构造 注意一个小坑,每条蛇的输出是要从头到尾输出的. 还要注意的是,不能开数组去模拟构造过程,然后输出,那样会TLE的. #include <cstdio> #include <cstring> #include <cmath> #include <vector> #include <algorithm> using namespace std; const int maxn=500+10; v

UVALive 6088 Approximate Sorting 构造题

题目链接:点击打开链接 题意: 给定一个n*n的01矩阵 我们跑一下例子== 4 0111 0000 0100 0110 0123 \|____ 0|0111 1|0000 2|0100 3|0110 用0-n-1随便构造一个序列: 如:1230 我们计算1230的权值 : int ans = 0; 对于个位0,我们查找第0行:0111,0前面的数有123, 则ans += a[0][1], ans+=a[0][2], ans+=a[0][3] 对于十位3.我们查找第3行:0110.3前面的数有

UVaLive 7637 Balanced String (构造)

题意:给定一个括号的序列,原先的序列是碰到左括号加1,碰到右括号减1,然后把序列打乱,让你找出字典序最小的一个答案. 析:直接从第一个括号判断就好了,优先判断左括号,如果不行就加右括号. 代码如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <string> #include <cstdlib> #include <cma

UVALive - 7637 E - Balanced String(构造)

原题链接 题意:给出一个打乱顺序的序列,问是否能构造出一个括号匹配的字符串.每个数字为此前读取到的左括号数减去右括号数. 分析:有左括号开始构造,不够的话就找右括号.注意特殊情况待处理.详情看代码 #include <iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<s

UVaLive 6588 &amp;&amp; Gym 100299I (贪心+构造)

题意:给定一个序列,让你经过不超过9的6次方次操作,变成一个有序的,操作只有在一个连续区间,交换前一半和后一半. 析:这是一个构造题,我们可以对第 i 个位置找 i 在哪,假设 i  在pos 位置,那么如果 (pos-i)*2+i-1 <= n,那么可以操作一次换过来, 如果不行再换一种,如果他们之间元素是偶数,那么交换 i - pos,如果是奇数,交换 i - pos+1,然后再经过一次就可以换到指定位置. 代码如下: #pragma comment(linker, "/STACK:1

15北京区域赛——构造——hihoCoder 1257 Snake Carper

注意是正的偶数..不包括零 还有n=2的时候应该横着放 #include <cstdio> #include <algorithm> using namespace std; void dfs(int n) { if(n == 1){ printf("1 1\n"); return; } else if(n ==2){ printf("1 1\n"); printf("1 2 1 3\n"); return; } else

HDU 5402 模拟 构造 Travelling Salesman Problem

题意: 有一个n * m的数字矩阵,每个格子放着一个非负整数,从左上角走到右下角,每个格子最多走一次,问所经过的格子的最大权值之和是多少,并且输出一个路径. 分析: 如果n和m有一个是偶数的话,那么只要按照蛇形的走法一直走下去即可. 比如n为奇数的时候就这样,左右左右地蛇形走. 同样的,如果m为奇数的时候,也可以上下上下地蛇形走. 但如果n和m都为偶数的时候,就会无法走完全部的格子,最终到达右下角. 但是可以少走一个格子,而且这个格子必须是那种行标加列标为奇数的格子才行(行和列从1开始),所以我