My coding way (3)

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值