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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值