2020 Multi-University Training Contest 4 1012 Last Problem(构造)

题目

  http://acm.hdu.edu.cn/showproblem.php?pid=6813

题意

  给出一个无限大的二维平面,每次选择一个点 ( x , y ) 将其染色为 n ,但是前提是,相邻四个格子必须分别已经染了 n - 1 , n - 2 , n - 3 , n - 4 四种颜色,染色可以覆盖,构造出一种合理的染色方案,使得可以在平面上出现颜色 n。 

题解

  构造出如图所示三角形,利用递归构造。

#include <bits/stdc++.h>
// #include <iostream>
// #include <cstring>
// #include <string>
// #include <algorithm>
// #include <cmath>
// #include <cstdio>
// #include <queue>
// #include <stack>
// #include <map>
// #include <bitset>
// #include <set>
// #include <vector>
// #include <iomanip>
#define ll long long
#define ull unsigned long long
#define met(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for(int i = a; i <= b; ++i)
#define bep(i, a, b) for(int i = a; i >= b; --i)
#define lowbit(x) (x&(-x))
#define MID (l + r) / 2
#define ls pos*2
#define rs pos*2+1
#define pb push_back
#define ios() ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)

using namespace std;

const int maxn = 1e6 + 1010;
const int inf = 0x3f3f3f3f;
const ll INF = 0x3f3f3f3f3f3f3f3f;
const ll mod = 1e9 + 7;
const double eps = 1e-6;
const double PI = acos(-1);

int MAP[2010][2010];

void dfs(int x, int y, int val) {
    if(val <= 0) return;
    if(MAP[x - 1][y] != val - 1)
        dfs(x - 1, y, val - 1);
    if(MAP[x][y - 1] != val - 2) 
        dfs(x, y - 1, val - 2);
    if(MAP[x][y + 1] != val - 3)
        dfs(x, y + 1, val - 3);
    if(MAP[x + 1][y] != val - 4)
        dfs(x + 1, y, val - 4);
    MAP[x][y] = val;
    printf("%d %d %d
", x, y, val);
}

int main() {
    int n;
    scanf("%d", &n);
    dfs(1000, 1000, n);
    return 0;
}
原文地址:https://www.cnblogs.com/Ruby-Z/p/13410805.html