字母旋转方阵

     字母旋转方阵

Time Limit: 1000MS Memory Limit: 65536KB

Submit Statistic Discuss

Problem Description

给定两个整数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

Input

M为行数,N为列数,其中M,N都为大于0的整数。

Output

分行输出相应的结果,注意每行开始有1个空格,相邻两个字母之间有1个空格。

Example Input

4 9

Example Output

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

think:
这道题看着就让我想起了递归里面的一道题目(文章最后附上),然后就按照之前的思路循环输入数据,然后再输出,当然,超时了……

#include <bits/stdc++.h>
using namespace std;
char m1[] = "ZABCDEFGHIJKLMNOPQRSTUVWXY";
char a[500][500];
void f(int n, int m)
{
  int i=1, j=1, top = 1;
  int k = 0;
  while(top<=m*n)
  {
    while(j<m-k&&top<=m*n&&a[i][j]=='\0')
    {
    a[i][j] = m1[top%26];
    top++;
    j++;
    }
    while(i<n-k&&top<=m*n&&a[i][j]=='\0')
    {
       a[i][j] = m1[top%26];
       top++;
       i++;
    }
    while(j>1+k&&top<=m*n&&a[i][j]=='\0')
    {
      a[i][j] = m1[top%26];
      top++;
      j--;
    }
    while(i>2+k&&top<=m*n&&a[i][j]=='\0')
    {
      a[i][j] = m1[top%26];
      top++;
      i--;
    }
    k++;
  }
  return ;
}
int main()
{
    int n, m;
    cin>>n>>m;
    f(n, m);
    for(int i=1;i<=n;i++)
    {
      for(int j=1;j<=m;j++)
      {
        cout<<" "<<a[i][j];
      }
      cout<<endl;
    }
    return 0;
}


/***************************************************
User name: 
Result: Time Limit Exceeded
Take time: 1010ms
Take Memory: 0KB
Submit time: 
****************************************************/

然后,看了别人的思路,才发现,很神奇,自己真的是没想到啊~

#include <stdio.h>
int main()
{
    int m, n;
    int flag = 0;
    int num1 = 0, num2 = 1;
    int i = 0, j = 0;
    char s = 'A';
    char a[31][31];
    scanf("%d %d",&m,&n);
    a[0][0] = s;
    while(flag < m*n-1)
    {
        switch(num2%4)
        {
        case 1:
            ++j;
            if(j == n-num1-1)
            {
                num2++;
            }
            break;
        case 2:
            ++i;
            if(i == m-num1-1)
            {
                num2++;
            }
            break;
        case 3:
            --j;
            if(j == num1)
            {
                num2++;
            }
            break;
        case 0:
            --i;
            if(i == num1+1)
            {
                num2++;
                num1++;
            }
            break;
        }
        if(++s == 'Z'+1)
            s = 'A';
        a[i][j]=s;
        flag++;
    }
    for(i=0; i<m; i++)
    {
        printf(" ");
        for(j=0; j<n; j++)
        {
            if(j!=n-1)
                printf("%c ", a[i][j]);
            else
                printf("%c", a[i][j]);
        }
        printf("\n");

    }

}

          螺旋方阵

Time Limit: 1000MS Memory Limit: 65536KB

Submit Statistic

Problem Description

n×n的螺旋方阵当n=5和n=3时分别是如下的形式

请给出一个程序,对于任意的输入n(0<n<11),输出按照上面规律所获得的n×n的螺旋方阵。

Input

输入第一行为整数m(0<m<10),代表有m组输入;
接下来是m行数据,每行输入一个n(0<n<11)。

Output

按照输入的次序,依次输出每一个n×n方阵(一个方阵的同一行数据之间以’\t’分隔)
两个输出方阵之间输出一个空行。

Example Input

1
4

Example Output

1   2   3   4
12  13  14  5
11  16  15  6
10 9  8   7

#include <iostream>
using namespace std;
int a[123][123];
int p;
void qr(int u, int d, int l, int r)
{
    if(l<=r)
    {
        int i;
        for(i=l;i<=r;i++)
            a[u][i] = p++;
        for(i=u+1;i<d;i++)
            a[i][r] = p++;
        for(i=r;i>l;i--)
            a[d][i] = p++;
        for(i=d;i>u;i--)
            a[i][l] = p++;
        return qr(u+1, d-1, l+1, r-1);
    }
}
int main()
{
    int n, T;
    while(cin>>T)
    {
        while(T--)
        {
            cin>>n;
            p = 1;
            int i, j;
            qr(0, n-1, 0, n-1);
            for(i=0;i<n;i++)
            {
                for(j=0;j<n-1;j++)
                    cout<<a[i][j]<<'\t';
                cout<<a[i][j]<<'\n';
            }
        }
    }
    return 0;
}

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值