URAL 1181 Cutting a Painted Polygon
2015-12-07 01:47
375 查看
题目
对于一个给定长度的字符串,这个字符串满足:1.有且仅有RGB三个字母,且每个字母至少出现一次
2.相邻的两个字母不同(环形)
题解
如果只有两种颜色,那么显然无解否则必定可以分一下两种情况:
1、有一种颜色只有1个,那么从这个连边到所有其他点分割
2、否则可以找到连续的三个点,它们的颜色互不相同
然后把这三个点连成三角形,变成n-1的问题,重复步骤
code
#include <algorithm> #include <bitset> #include <cassert> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <iostream> #include <map> #include <queue> #include <set> #include <string> #include <vector> const int maxn = 1010; typedef std::vector<int> Polygon; int n; char s[maxn]; int nxt(int i, int n) { return (i+1)%n; } void dfs(const Polygon& A) { // printf("L, R: %d %d\n", L, R); int n = A.size(); // for (int i = 0; i < n; ++ i) printf("%d ", A[i]); putchar('\n'); int r = 0, g = 0, b = 0, pr, pg, pb, p3; for (int i = 0; i < n; ++ i) { if (s[A[i]] == 'R') { ++ r; pr = i; } if (s[A[i]] == 'G') { ++ g; pg = i; } if (s[A[i]] == 'B') { ++ b; pb = i; } if (s[A[i]] != s[A[nxt(i, n)]] && s[A[i]] != s[A[nxt(nxt(i, n), n)]] && s[A[nxt(i, n)]] != s[A[nxt(nxt(i, n), n)]]) { p3 = i; } } if (r == 1 || g == 1 || b == 1) { int p; if (r == 1) p = pr; if (g == 1) p = pg; if (b == 1) p = pb; for (int i = nxt(nxt(p, n), n); nxt(i, n) != p; i = nxt(i, n)) printf("%d %d\n", A[p]+1, A[i]+1); return; } printf("%d %d\n", A[p3]+1, A[nxt(nxt(p3, n), n)]+1); Polygon B; for (int i = nxt(nxt(p3, n), n); i != nxt(p3, n); i = nxt(i, n)) B.push_back(A[i]); dfs(B); } void solve() { scanf("%d%s", &n, s); /* int r = 0, g = 0, b = 0; for (int i = 0; i < n; ++ i) if (s[i] == s[(i+1)%n]) { puts("0"); return; } for (int i = 0; i < n; ++ i) { if (s[i] == 'R') { ++ r; } if (s[i] == 'G') { ++ g; } if (s[i] == 'B') { ++ b; } } if (r == 0 || g == 0 || b == 0) { puts("0"); return; } */ printf("%d\n", n-3); Polygon S; for (int i = 0; i < n; ++ i) S.push_back(i); dfs(S); } int main() { // freopen("G.in", "r", stdin); solve(); // for(;;); return 0; }