QUSTOJ1227:打印图形

Description

你对迷宫感兴趣吗?现在请你设计一个迷宫,要求你输入一个整形数字n(0<n<101),然后就形成一个n * n规模的迷宫方阵。

若输入的是5,那么将会输出如下迷宫。迷宫的按字母顺序从外向内旋转,若26个字母用完则从A开始循环使用。

A BC D E

P Q R S F

O X Y T G

N W V U H

M L K J I

Input

第一行输入一个整数T,这个数字为测试数据的个数。从第二行开始会有T行测试数据,每行测试数据输入一个数n,表示迷宫的规模。

 

Output

与测试数据对应,刚好有T个迷宫。在每个迷宫中,注意每行中每两个字母间有一个空格,每行最后一个字母后没有空格。

Sample Input

3346

Sample Output

A B C
H I D 
G F E
A B C D
L M N E
K P O F
J I H G
A B C D E F
T U V W X G
S F G H Y H
R E J I Z I
Q D C B A J
P O N M L K
比较直观的方法是直接模拟,当然本题也可以用递归的方法来解,模拟法代码如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
	char a[101][101];
	char flag;
	int x,y,T,m,n,k,p;
	int xxor(int x,int y,int n);
	scanf("%d",&T);
	for(int i=1;i<=T;i++)
	{
		scanf("%d",&n);
		m=1;
		x=y=1;
		flag='A';
		p=n*n;
		while(m<=p)
		{
			a[x][y]=flag;
			flag++;//flag是待赋值字母,用flag来实现26个字母的循环 
			if(flag==91)flag='A';
			k=xxor(x,y,n);
			switch(k)// 通过判断函数的返回值决定赋值的方向 
			{
				case 1:x++;break;
				case 2:y++;break;
				case 3:x--;break;
				case 4:y--;break;
			}
			m++;
		}
		for(int l=1;l<=n;l++)//输出迷宫 
		{
			for(int j=1;j<=n-1;j++)
			{
				printf("%c ",a[j][l]);
			}
			printf("%c\n",a[n][l]);
		}		
	}
	return 0;
}
int xxor(int x,int y,int n)// 将方格图划分为五个区域,每个区域内移动方向相同 
{
	while(1)
	{
	
		if(x>=y&&x+y<=n)
		{
			return 1;
			break;
		}
		if(x+1==y&&x+y<=n)
		{
			return 1;
			break;
		}
		if(x>y&&x+y>n)
		{
			return 2;
			break;
		}
		if(x<=y&&x+y>n+1)
		{
			return 3;
			break;
		}
		if(x<y&&x+y<=n+1&&x+1!=y)
		{
			return 4;
			break;
		}
		break;
	}
}
递归法代码如下:
#include <stdio.h>

int a[101][101];
char z[]={"ABCDEFGHIJKLMNOPQRSTUVWXYZ"};
int sum;

void layer(int x,int y,int n,int shu)
{
	int i;
	//x=0 y=0 n=5 shu=1 a00=1

	//x=1  y=1  n=3 , shu = 17

	a[x][y] = shu++;

	if(shu >= sum)
		return;
	//first time
	//i=0 x=0 y=0 n=5 a00=1 shu=2

	//i=0 x=0 y=1 n=5 a01=2 shu=3
	//i=1 x=0 y=2 n=5 a02=3 shu=4
	//i=2 x=0 y=3 n=5 a04=4 shu=5
	//i=3 x=0 y=4 n=5 a04=5 shu=6

	//second time
	//i=0 x=1 y=1 n=3 a11=17 shu=18
	//i=0 x=1 y=1 n=3 a12=18 shu=19
	//i=1 x=1 y=2 n=3 a13=19 shu=20

	for(i=0;i<n-1;i++)
	{
		y++;
		a[x][y] = shu++;

	}
	//i=0 x=1 y=4 n=5 a14=6 shu=7
	//i=1 x=2 y=4 n=5 a24=7 shu=8
	//i=2 x=3 y=4 n=5 a34=8 shu=9
	//i=3 x=4 y=4 n=5 a44=9 shu=10

	for(i=0;i<n-1;i++)
	{
		x++;
		a[x][y] = shu++;
		
	}
	
	//i=0 x=4 y=3 n=5 a43=10 shu=11
	//i=1 x=4 y=2 n=5 a42=11 shu=12
	//i=2 x=4 y=1 n=5 a41=12 shu=13
	//i=3 x=4 y=0 n=5 a40=13 shu=14

	for(i=0;i<n-1;i++)
	{
		y--;
		a[x][y] = shu++;		
	}

	//i=0 x=3 y=0 n=5 a30=14 shu=15
	//i=1 x=2 y=0 n=5 a20=15 shu=16
	//i=2 x=1 y=0 n=5 a10=16 shu=17

	for(i=0;i<n-2;i++)
	{
		x--;
		a[x][y] = shu++;		
	}

	if(n%2 == 0)
		if(shu >= sum)
				return;
	y++;


	//x=1  y=1  n-2=3 , shu = 17
	layer(x,y,n-2,shu);

}

void main()
{
	int x=0;
	int y=0;
	int n,t;
	int i,j;
	scanf("%d",&t);
	
		for(;t>0;t--)
		{
			scanf("%d",&n);
			sum = n*n;
			layer(x,y,n,1);

			for(i=0;i<n;i++)
			{
				for(j=0;j<n;j++)
				{
					if(a[i][j]<26)
					{
						printf("%c",z[a[i][j]-1]);
						if(j<n-1)
							printf(" ");
					}
					else
					{
						printf("%c",z[(a[i][j]-1)%26]);
						if(j<n-1)
							printf(" ");
					}
				}
				printf("\n");
			}
		}
	
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值