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