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=n,j=ii;
		int num=0;
		while(1)
		{
			if(ii%2==1)
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}
	int i=n/2+2,j=n/2+1;
	int num=0;
	while(1)
	{
		a[i][j]=4;
		if(a[i-1][j]==0)
			i--;
		else
			j++;

		num++;
		if(num==n)
			break;
	}
	for(int ii=(n-1)/2+3;ii<=n;ii++)
	{
		int i=n,j=ii-2;
		int num=0;
		while(1)
		{
			if(ii%2==1)
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}
}
void fuck2()
{
	for(int ii=1;ii<=n/2;ii++)//9
	{
		int i=n,j=ii;
		int num=0;
		while(1)
		{
			if(ii%2==1)
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}
	int i=n/2+2,j=n/2+1;
	int num=0;
	while(1)
	{
		a[i][j]=4;
		if(a[i-1][j]==0)
			i--;
		else
			j++;
		num++;
		if(num==n)
			break;
	}
	for(int ii=(n-1)/2+3;ii<=n;ii++)
	{
		int i=n,j=ii-2;
		int num=0;
		while(1)
		{
			if(ii%2==1)
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}
}
void fuck3()
{
	for(int ii=1;ii<=n/2;ii++)//10
	{
		int i=n,j=ii;
		int num=0;
		while(1)
		{
			if(ii%2==1)
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}
	int i=n/2+2,j=n/2+1;
	int num=0;
	while(1)
	{
		a[i][j]=4;
		if(a[i-1][j]==0)
			i--;
		else
			j++;

		num++;
		if(num==n)
			break;
	}
	for(int ii=n/2+3;ii<=n;ii++)
	{
		int i=n,j=ii-2;
		int num=0;
		while(1)
		{
			if(ii%2==1)
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}
}
void fuck4()
{
	for(int ii=1;ii<=n/2;ii++)//8
	{
		int i=n,j=ii;
		int num=0;
		while(1)
		{
			if(ii%2==1)
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}
	int i=n/2+2,j=n/2+1;
	int num=0;
	while(1)
	{
		a[i][j]=4;
		if(a[i-1][j]==0)
			i--;
		else
			j++;
		num++;
		if(num==n)
			break;
	}
	for(int ii=n/2+3;ii<=n;ii++)
	{
		int i=n,j=ii-2;
		int num=0;
		while(1)
		{
			if(ii%2==0)
			{
				a[i][j]=3;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			else
			{
				a[i][j]=2;
				if(a[i-1][j]==0)
					i--;
				else
					j++;
			}
			num++;
			if(num==n)
				break;
		}
	}

}
int main ()
{
	int t;
	while(scanf("%d",&t)!=EOF)
	{
		while(t--)
		{
			memset(a,0,sizeof(a));
			scanf("%d",&n);
			if(n==1)
				printf("Y\n");
			else if(n==2||n==3||n==4)
				printf("No solution!\n");
			else if(n==6)
			{
				printf("YYYYYY\n");
				printf("RRBBBB\n");
				printf("YRRRRB\n");
				printf("YYBBGB\n");
				printf("YYBBGG\n");
				printf("YBBGGG\n");
			}
			else
			{
				memset(a,0,sizeof(a));
				for(int i=1;i<=n;i++)
					a[1][i]=1;
				if(n%2==1)//奇数
				{
					if((n/2)%2==1)//7
						fuck1();
					else//9
						fuck2();
				}
				else
				{
					if((n/2)%2==1)//10
						fuck3();
					else//8
						fuck4();
				}
				for(int i=1;i<=n;i++)
				{
					for(int j=1;j<=n;j++)
					{
						//printf("%d",a[i][j]);
						if(a[i][j]==1)
							printf("Y");
						else if(a[i][j]==2)
							printf("G");
						else if(a[i][j]==3)
							printf("R");
						else if(a[i][j]==4)
							printf("B");
					}
					printf("\n");
				}
			}
		}
	}
	return 0;
}
时间: 2024-09-30 02:53:07

ZOJ 3810 A Volcanic Island 构造题的相关文章

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 ( 构造 )

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

ZOJ 3810 A Volcanic Island

题意: n*n的格子  将它分成n份大小为n的连通块  要求每个块形状不同  用4种颜色将格子染色后输出 思路: 纯构造题  考验智商  不过还是有思路可寻的 首先这题要想到将格子分区域的去做(想不到就没办法了-)假设我们两行为一个区域  那么将这两行划分成两个面积为n的块之后发现它们的形状必然相同  因此两行不行  所以我们尝试3行为1个区域!!  可以构造: 这样构造就可以保证形状不同  但是绿色会连上!!  那么我们通过奇偶性将图翻转  这样绿色就不会连上了  因为连起来至少需要绿色的外边

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>

HDU 5402 (构造题) Travelling Salesman Problem

题意 略. 思路 比赛的时候其实已经意识到是一个构造题了. 蓝儿m,n都是偶数的时候搞崩了.sad.. m,n有一个是奇数不说了,可以走完所有. 两个都是偶数的时候,我们就去找一个最小的值且它的位置坐标和是奇数,然后就绕开这个走.其他都可以走完辣. 参考code: /* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000") */ #include <cassert> #incl

Codeforces 482 - Diverse Permutation 构造题

这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ................... \  /        \  /           \  / k          k-1          k-2 如图所示,先构造第一个数,就是1 + k, 然后接下来每个数字和上个数相差k , k -1 , k -2 这样下来,最后一个数字就是一个中间的数字,过程就

HDU 4961 Boring Sum 构造题

用一个数组c, c[i]表示i这个数出现的最近数字是几. 那么当加入一个6,则 c[1] = c[2] = c[3] = c[6] = 6; ==最近怎么都要开挂啊.. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 100005; inl

codeforces 459C - Pashmak and Buses 【构造题】

题目:codeforces 459C - Pashmak and Buses 题意:给出n个人,然后k辆车,d天时间,然后每天让n个人选择坐一辆车去上学,要去d天不能有任意两个人乘同一辆车,不能的话输出 -1 分类:数学,构造 分析:这个题目首先得分析,我开始想到的是首先用相同的放在一起,比如 7 2 3 这样构造 1 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 就是需要的天数跟每一行出现次数最多的数的出现次数相等,但是发现还有更优