问题 B: 打印图形
时间限制: 1 Sec 内存限制: 128 MB
题目描述
你对迷宫感兴趣吗?现在请你设计一个迷宫,要求你输入一个整形数字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
输入
第一行输入一个整数T,这个数字为测试数据的个数。从第二行开始会有T行测试数据,每行测试数据输入一个数n,表示迷宫的规模。
输出
与测试数据对应,刚好有T个迷宫。在每个迷宫中,注意每行中每两个字母间有一个空格,每行最后一个字母后没有空格。
样例输入
3
3
4
6
样例输出
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>_< 最开始并没有任何思路w 想想还是没办法直接解于是采用了模拟磁针移动的方法w
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
char data;
int vis;
}pack;
pack screen[102][102];
#define RIGHT 0
#define DOWN 1
#define LEFT 2
#define UP 3
void deal(int incmax)
{
memset(screen,0,sizeof(pack)*102*102);
char letter='A';
int cx,cy,towards,i;
int times=incmax*incmax;
for(i=0;i<incmax+2;i++)
{
screen[0][i].vis=1;
screen[i][0].vis=1;
screen[incmax+1][i].vis=1;
screen[i][incmax+1].vis=1;
}
for(cx=1,cy=1,towards=RIGHT;times>0;times--)
{
screen[cx][cy].data=letter++;
screen[cx][cy].vis=1;
(letter>'Z')?(letter='A'):(NULL);
switch(towards)
{
case RIGHT:
{
if(screen[cx][cy+1].vis==1)
{
towards++;
cx++;
}
else
{
cy++;
}
break;
}
case DOWN:
{
if(screen[cx+1][cy].vis==1)
{
towards++;
cy--;
}
else
{
cx++;
}
break;
}
case LEFT:
{
if(screen[cx][cy-1].vis==1)
{
towards++;
cx--;
}
else
{
cy--;
}
break;
}
case UP:
{
if(screen[cx-1][cy].vis==1)
{
towards=0;
cy++;
}
else
{
cx--;
}
break;
}
}
}
}
void print_map(int incmax)
{
int x,y;
for(x=1;x<incmax+1;x++)
{
for(y=1;y<incmax;y++)
{
printf("%c ",screen[x][y].data);
}
printf("%c\n",screen[x][y].data);
}
}
int main()
{
int all,inc;
scanf("%d",&all);
for(;all>0;all--)
{
scanf("%d",&inc);
deal(inc);
print_map(inc);
}
return 0;
}