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\n", x, y, val);
}
int main() {
int n;
scanf("%d", &n);
dfs(1000, 1000, n);
return 0;
}