螺旋矩阵(递归问题)

题目描述:

Problem Description

bLue 有一个长度为 n*n 的序列,现在他想把这个序列填到一个 n*n 的螺旋矩阵中,你能帮助他吗?

Input

输入数据有多组(数据组数不超过 20),到 EOF 结束。

对于每组数据:

  • 第 1 行输入 1 个奇数 n (1 <= n <= 9, n%2 = 1)
  • 第 2 行输入 n*n 个用空格隔开的整数(范围 [0, 100]),表示初始序列

Output

对于每组数据,输出一个 n*n 的矩阵,同一行内相邻整数之间用一个 '\t' 隔开。每组数据结尾额外输出一行空行。

Sample Input

3
1 2 3 4 5 6 7 8 9
5
5 3 2 4 8 7 1 6 9 10 11 12 13 14 15 16 17 18 19 20 21 25 27 29 33

Sample Output

7	8	9
6	1	2
5	4	3

21	25	27	29	33
20	1	6	9	10
19	7	5	3	11
18	8	4	2	12
17	16	15	14	13
 1 #include <stdio.h>
 2 #include <string.h>
 3 int i, a[125], p[12][12];/*数组a存放数据,数组p建立螺旋矩阵*/
 4 void Creat(int n, int left, int right);/*螺旋递归矩阵建立*/
 5 int main()
 6 {
 7     int n;
 8     while(scanf("%d", &n) != EOF){
 9         memset(a, 0, sizeof(a));
10         memset(p, 0, sizeof(p));
11         for(i = 1; i <= n * n; i++)
12             scanf("%d", &a[i]);
13         i = 0;
14         int j;
15         Creat(n, n / 2 + 1, n / 2 + 1);
16         for(i = 1; i <= n; i++){
17             for(j = 1; j <= n; j++){
18                 if(j == n)
19                     printf("%d\n", p[i][j]);
20                 else printf("%d\t", p[i][j]);
21             }
22         }
23         printf("\n");
24     }
25     return 0;
26 }
27 void Creat(int n, int left, int right)
28 {
29     int k;
30     if(left == right)
31         p[left][right] = a[++i];
32     else{
33         for(k = left; k <= right; k++)
34             p[k][right] = a[++i];
35         for(k = right - 1; k >=  left - 1; k--)
36             p[right][k] = a[++i];
37         for(k = right - 1; k >= left - 1; k--)
38             p[k][left - 1] = a[++i];
39         for(k = left; k <= right; k++)
40             p[left - 1][k] = a[++i];
41     }
42     if(left == right)  /*第一圈起始位置的情况*/
43         Creat(n, left, right + 1);
44     else if(right < n)  /*递归边界*/
45         Creat(n, left - 1, right + 1);  //右上角
46 }

猜你喜欢

转载自www.cnblogs.com/Bravewtz/p/10325780.html