ZOJ 3810 A Volcanic Island

题意:

n*n的格子  将它分成n份大小为n的连通块  要求每个块形状不同  用4种颜色将格子染色后输出

思路:

纯构造题  考验智商  不过还是有思路可寻的

首先这题要想到将格子分区域的去做(想不到就没办法了…)假设我们两行为一个区域  那么将这两行划分成两个面积为n的块之后发现它们的形状必然相同  因此两行不行  所以我们尝试3行为1个区域!!  可以构造:

这样构造就可以保证形状不同  但是绿色会连上!!  那么我们通过奇偶性将图翻转  这样绿色就不会连上了  因为连起来至少需要绿色的外边长为n/2  但我们是3列分1个区域  也就是说绿色外边长最大就是n/3

还有问题  因为n不见得正好被3整除  不整除的时候如果余1就好办(直接加一行纯色的)  余2就麻烦了

如果余2  那么我们需要拆掉上图中的第一个(也就是构造时候绿色边长从2开始)  这时我们共有5行  填一行纯色的  还剩4行  接下来按这样构造:

根据上述构造方法  在n整除3的时候还会出现问题  因为图1中绿色的部分可能变成矩形  导致红色和蓝色形状相同  这时候只要把红色和蓝色其中一个格子换一下就好了  换的方法有很多(只要这两个不对称就行)

还有要注意特判1和5的时候直接构造一个答案输出  2、3、4时候没答案

代码:

#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<vector>
using namespace std;
typedef long long LL;
#define N 110
#define M 400010
#define inf 2147483647
#define lowbit(x) (x&(-x))

char f[N][N]; //RBYG

int main() {
	int t, n, i, j, k, flag;
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);
		if (n == 1)
			puts("R");
		else if (n < 5)
			puts("No solution!");
		else if (n == 5) {
			puts("YYYGR");
			puts("YGGGR");
			puts("YGYYR");
			puts("BYYYR");
			puts("BBBBR");
		} else {
			flag = n / 3;
			for (k = n; k > 5; k -= 3, flag--) {
				for (i = k; i > k - 3; i--) {
					for (j = 1; j <= n; j++)
						f[i][j] = 'R';
				}
				if (flag & 1) {
					for (i = k; i > k - 3; i--) {
						for (j = n - flag + 1; j <= n; j++)
							f[i][j] = 'Y';
					}
					for (j = flag * 2 + 1; j <= n; j++)
						f[k - 1][j] = 'Y';
					for (j = flag + 1; j <= flag + flag; j++)
						f[k - 1][j] = 'B';
					for (j = 1; j <= n - flag; j++)
						f[k][j] = 'B';
				} else {
					for (i = k; i > k - 3; i--) {
						for (j = 1; j <= flag; j++)
							f[i][j] = 'Y';
					}
					for (j = 1; j <= n - flag * 2; j++)
						f[k - 1][j] = 'Y';
					for (j = n - flag - flag + 1; j <= n - flag; j++)
						f[k - 1][j] = 'B';
					for (j = flag + 1; j <= n; j++)
						f[k][j] = 'B';
				}
			}
			if (k > 3) {
				for (j = 1; j <= n; j++)
					f[k][j] = 'G';
				k--;
			}
			if (k > 3) {
				for (i = 1; i <= 4; i++) {
					for (j = 1; j <= n; j++)
						f[i][j] = 'G';
				}
				for (i = 1; i <= 4; i++)
					f[i][1] = 'R';
				for (j = 2; j <= n - 3; j++)
					f[4][j] = 'R';
				f[4][n - 2] = f[4][n - 1] = f[4][n] = 'B';
				for (j = 2; j <= n - 2; j++)
					f[3][j] = 'B';
				f[3][n - 1] = f[3][n] = 'Y';
				for (j = 2; j <= n - 1; j++)
					f[2][j] = 'Y';
			} else {
				for (i = 1; i <= 3; i++) {
					for (j = 1; j <= n; j++)
						f[i][j] = 'Y';
				}
				for (j = 1; j <= n - 1; j++)
					f[1][j] = 'R';
				f[2][1] = 'R';
				for (j = 1; j <= n - 1; j++)
					f[3][j] = 'B';
				f[2][2] = 'B';
			}
			if (n % 3 == 0) {
				flag = n / 3;
				if (flag & 1)
					swap(f[n - 1][1], f[n - 1][flag + 1]);
				else
					swap(f[n - 1][n - flag], f[n - 1][n]);
			}
			for (i = 1; i <= n; i++) {
				for (j = 1; j <= n; j++)
					putchar(f[i][j]);
				putchar('\n');
			}
		}
	}
	return 0;
}
时间: 2024-09-30 08:46:36

ZOJ 3810 A Volcanic Island的相关文章

ZOJ 3810 - A Volcanic Island ( 构造 )

ZOJ 3810 - A Volcanic Island ( 构造 ) 题意: 给定一个N*N 的方格,需要用4种颜色进行染色, 要求:划分出N片区域,每片区域用一种颜色,且构造出的区域形状,颜色,旋转后的形状都不能相同 分析: 构造的题目一直都不是很好做,主要是因为自己智商太低.. 这个是看了郏老大的题解才会构造的,至于为什么这样构造.也说不出一个所以然来. 代码: #include <cstdio> #include <cstring> #include <algorit

zoj 3810 A Volcanic Island(构造)

题目链接:zoj 3810 A Volcanic Island 题目大意:给定n,要求用n块面积为n的拼图铺满n?n的矩阵,任意两块拼图形状不能相同(包括旋转和镜像),并且n块拼图只能有4中颜色,相邻两块拼图颜色不能相同. 解题思路:构造,n = 2,3,4时是不存在的.然后对于n >= 5的直接构造,具体看代码.注意这种构造方式构造6的时候会出现相同的拼图,所以特判. #include <cstdio> #include <cstring> #include <alg

ZOJ 3810 A Volcanic Island(四色定理模板)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5342 A Volcanic Island Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge An underwater volcano has erupted massively in somewhere of the deep Atlantis Ocean. This larg

ZOJ 3810 A Volcanic Island (2014年牡丹江赛区网络赛B题)

1.题目描写叙述:点击打开链接 2.解题思路:本题是四色定理的模板题.只是有几种情况要提前特判一下:n==1直接输出,1<n<5时候无解,n==6时候套用模板会出现同样的块.因此要特判一下.其它情况都能直接利用模板构造出来. 3.代码: #define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<algorithm> #include<cassert> #include<string>

ZOJ 3810 A Volcanic Island 构造题

题目链接:点击打开链接 学弟是厉害啊.. #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <queue> using namespace std; int vis[110][110],a[110][110],n; void fuck1() { for(int ii=1;ii<=n/2;ii++)//7 { int i

ZOJ 3810 Pretty Poem

Pretty Poem Time Limit: 2 Seconds     Memory Limit: 65536 KB Poetry is a form of literature that uses aesthetic and rhythmic qualities of language. There are many famous poets in the contemporary era. It is said that a few ACM-ICPC contestants can ev

托福分类词汇

托福分类词汇表(共17类863个常用单词) 一.   psychology 心理 1.       mental 心理的 2.       physical 身体的,物质的,物理的 3.       spiritual 心灵的 4.       conformity 从众 5.       majority 多数人 6.       minority 少数人 7.       threshold judgment (心理学)初始性判断 8.       subject 受实验对象 9.     

2014牡丹江网络预选赛B题(找规律)zoj3810

A Volcanic Island Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge An underwater volcano has erupted massively in somewhere of the deep Atlantis Ocean. This large eruption led to the birth of a new volcanic island, which had a sha

zoj 2254 - Island Country

题目:两个人到一个有很多岛屿组成的国家,求两人按相同顺序参观的最大岛屿数. 分析:dp,LIS,LCS.本题有两种解决方案,LCS,LIS. LCS:对两人分别排序,找出编号的 LCS即可 T = O(n^2): LIS:利用映射关系,将 LCS转化成 LIS即可 T = O(nlogn): 转化有点恶心,求出排序后的 与a对应的的编号相同的 b点的位置 . 说明:写了一个 LIS的函数...不过和大黄的差了好多啊...ym~~. #include <stdio.h> #include <