字母旋转方阵

来源:互联网 发布:网络与新媒体专业方向 编辑:程序博客网 时间:2024/05/16 09:22
     字母旋转方阵

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 ExceededTake time: 1010msTake Memory: 0KBSubmit 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;}
原创粉丝点击