“IBM南邮杯”南京邮电大学第二届大学生程序设计竞赛之预赛-蛇形矩阵

描述

 

给定两个整数MN,生成一个M*N的矩阵,矩阵中元素取值为AZ26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5N=8时,矩阵中的内容如下:

  A   B    C   D   E   F   G   H
   V   W   X   Y   Z   A   B   I
   U   J   K   L   M   N   C   J
   T   I   H   G    F    E   D   K
   S   R   Q   P   O   N   M   L

输入

每个测试样例包括一行,分别是两个整数M,N,其中M为行数,N为列数,其中0<MN<100

输出

每个测试样例输出相应的矩阵,每个字母占4列,即每一个字母前面有三个空格。

样例输入

6 3

样例输出

   A   B   C
   N   O   D
   M   Q   E
   L   R   F
   K   P   G
   J   I   H
这个神坑题,为什么神坑,请看看测试用例。花了我半天多的时间才搞出来,要分不同的状态输出,行大于列还有奇偶数的时候,为了图方便我多了70多行的代码

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[110][110];
int n,m,N,i,j,k,z;
int ch,fx=0;
int fun()
{
        i=j=1;
        fx=0;
        ch=0;
        N=n*m;
        memset(a,-1,sizeof(a));
        a[1][m+1]=1;
        a[n+1][m]=1;
        a[n][0]=1;
        a[0][0]=1;
        while(N > 0)
        {
            if(fx==0)
            {
                while(a[i][j]==-1)
                {
                    a[i][j++]=(ch++)%26;
                    N--;
                }
                i++;
                j--;
            }
            else if(fx==1)
            {
                while(a[i][j]==-1)
                {
                    a[i++][j]=(ch++)%26;
                    N--;
                }
                i--;
                j--;
            }
            else if(fx==2)
            {
                while(a[i][j]==-1)
                {
                    a[i][j--]=(ch++)%26;
                    N--;
                }
                i--;
                j++;
            }
            else if(fx==3)
            {
                while(a[i][j]==-1)
                {
                    a[i--][j]=(ch++)%26;
                    N--;
                }
                i++;
                j++;
            }
            fx=(fx+1)%4;
        }
        for(i=1;i<=n;i++)
        { for(j=1;j<m;j++)
             printf("%4c",char('A'+a[i][j]));
        printf("%4c\n",char('A'+a[i][j]));
        }
}
int fun1()
{
        i=j=1;
        fx=0;
        ch=0;
        N=n*m;
        memset(a,-1,sizeof(a));
        a[1][m+1]=1;
        a[n+1][m]=1;
        a[n][0]=1;
        a[0][0]=1;
        while(N > n-m)
        {
            if(fx==0)
            {
                while(a[i][j]==-1)
                {
                    a[i][j++]=(ch++)%26;
                    N--;
                }
                i++;
                j--;
            }
            else if(fx==1)
            {
                while(a[i][j]==-1)
                {
                    a[i++][j]=(ch++)%26;
                    N--;
                }
                i--;
                j--;
            }
            else if(fx==2)
            {
                while(a[i][j]==-1)
                {
                    a[i][j--]=(ch++)%26;
                    N--;
                }
                i--;
                j++;
            }
            else if(fx==3)
            {
                while(a[i][j]==-1)
                {
                    a[i--][j]=(ch++)%26;
                    N--;
                }
                i++;
                j++;
            }
            fx=(fx+1)%4;
        }
        while(N>=0)
        {

             while(a[i][m/2+1]==-1)i++;
             if( a[i-1][m/2+1]==-1)
             a[--i][m/2+1]=(ch++)%26;
             N--;
             i--;
             while(a[i][m/2+1]==-1)i--;
             if( a[i+1][m/2+1]==-1)
             a[++i][m/2+1]=(ch++)%26;
             i++;
             N--;
        }
        for(i=1;i<=n;i++)
        { for(j=1;j<m;j++)
             printf("%4c",char('A'+a[i][j]));
        printf("%4c\n",char('A'+a[i][j]));
        }
}
int main()
{

    while(cin>>n>>m)
    {
        if(n>m&&m%2==1)
         fun1();
         else fun();
    }
    return 0;
}


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值