螺旋矩阵

第一题

打印出一个旋转方阵,见样例输出。

输入输出格式
输入描述:
1
输入一个整数n(1 <= n <= 20), n为方阵的行数。
输出描述:
1
输出一个大小为n*n的距阵
输入输出样例
输入样例#:
1
5
输出样例#:
1
2
3
4
5
1   16  15  14  13
2 17 24 23 12
3 18 25 22 11
4 19 20 21 10
5 6 7 8 9
题目来源
1
福州大学2018年机试题
AC代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
int main()
{
int n,len;
scanf("%d",&n);
if(n%2==0)
len=n/2;
else
len=n/2+1;
int a[20][20];
int w=1;
for(int k=0;k<len;++k)
{
//左上-->左下
for(int i=k;i<n-k;++i)
{
a[i][k]=w;
w++;
}
//左下-->右下
for(int i=k+1;i<n-k;++i)
{
a[n-k-1][i]=w;
w++;
}
//右下-->右上
for(int i=n-k-2;i>=k;--i)
{
a[i][n-k-1]=w;
w++;
}
//右上-->左上
for(int i=n-k-2;i>k;--i)
{
a[k][i]=w;
w++;
}
}

for(int i=0;i<n;++i)
{
for(int j=0;j<n;++j)
{
printf("%-4d",a[i][j]);
}
printf("\n");
}

}

第二题

题目描述

本题要求将给定的 N 个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第 1 个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为 mn 列,满足条件:m×n 等于 Nmn;且 mn 取所有可能值中的最小值。

输入格式:

输入在第 1 行中给出一个正整数 N,第 2 行给出 N 个待填充的正整数。所有数字不超过 104,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行 n 个数字,共 m 行。相邻数字以 1 个空格分隔,行末不得有多余空格。

输入样例:

1
2
12
37 76 20 98 76 42 53 95 60 81 58 93

输出样例:

1
2
3
4
98 95 93
42 37 81
53 20 76
58 60 76

AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <stdio.h>
#include <algorithm>
using namespace std;
int main()
{
int N;
scanf("%d",&N);
int a[N];
for(int i=0;i<N;++i) scanf("%d",&a[i]);
sort(a,a+N);
int b[N],j=0;
for(int i=N-1;i>=0;--i)
b[j++]=a[i];
int m,n;
for(int i=N;i>=1;--i)//m
{
for(int j=1;j<=N;++j)//n
{
if((i*j==N)&&(i>=j))
{
m=i;
n=j;
}
}
}
//printf("%d %d",m,n);
int out[m][n];
int time;//每个方向上的循环次数
if(m%2==0)
time=m/2;
else
time=m/2+1;

int t=0;//正在填充第几个数
for(int i=0;i<time;++i)
{
//左上-->右上
for(int j=i;t<N&&j<n-i;++j)
{
out[i][j]=b[t++];
}

//右上-->右下
for(int j=i+1;t<N&&j<m-1-i;++j)
{
out[j][n-1-i]=b[t++];
}

//右下-->左下
for(int j=n-1-i;t<N&&j>=i;--j)
{
out[m-1-i][j]=b[t++];
}

//左下-->左上
for(int j=m-2-i;t<N&&j>=i+1;--j)
{
out[j][i]=b[t++];
}
}


for(int i=0;i<m;++i)
{
for(int j=0;j<n;++j)
{
printf("%d",out[i][j]);
if(j<n-1)
printf(" ");
}
if(i<m-1)
printf("\n");
}
}
凡希 wechat
喜欢所以热爱,坚持干货分享,欢迎订阅我的微信公众号
呐,请我吃辣条