19/7每日一题acm:字母旋转

题目如下:

给定两个整数M,N,生成一个M*N的矩阵,矩阵中元素取值为A至Z的26个字母中的一个,A在左上角,其余各数按顺时针方向旋转前进,依次递增放置,当超过26时又从A开始填充。例如,当M=5,N=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的整数。

输出描述

分行输出相应的结果

输入例子

4 9

输出例子

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

 

分析:这题在于分析字母旋转的规律,必须注意字母的总数为n*m,在建立二维数组map时要先初始化,再对map[0][0]赋值为'A',之后就是while循环了。

代码如下:

#include <iostream>
using namespace std;
 
char map[10000][10000];
 
int main(void)
{
    int i, j, m, n, tot;
    char ch = 'A';
    cin >> m >> n;
 
    for(i = 0; i < m; i++)
       for (j = 0; j < n; j++)
            map[i][j] = '0';
 
    i = j = tot = 0;
    map[i][j] = 'A';
    while (tot < n*m-1)
        {
          while (j+1 < n && map[i][j+1] == '0')
               {
                if (ch >= 90)  ch -= 26;
                j = j + 1;
                ch = ch + 1;
                map[i][j] = ch;
                tot = tot + 1;
               }
          while (i+1 < m && map[i+1][j] == '0')
               {
                if (ch >= 90)  ch -= 26;
                i = i + 1;
                ch = ch + 1;
                map[i][j] = ch;
                tot = tot + 1;
               }
          while (j-1 >= 0 && map[i][j-1] == '0')
               {
                if (ch >= 90)  ch -= 26;
                j = j - 1;
                ch = ch + 1;
                map[i][j] = ch;
                tot = tot + 1;
               }
          while (i-1 >= 0 && map[i-1][j] == '0')
               {
                if (ch >= 90)  ch -= 26;
                i = i - 1;
                ch = ch + 1;
                map[i][j] = ch;
                tot = tot + 1;
               }
        }
 
    for (i = 0; i < m; i++)
    {
       for (j = 0; j < n; j++)
            cout << "   " << map[i][j];
       cout << endl;
    }

    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值