字母旋转方阵
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;
}