码迷,mamicode.com
首页 > 其他好文 > 详细

数组-13. 螺旋方阵

时间:2014-08-26 00:09:25      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   java   os   io   for   ar   

 1 /*
 2  * Main.c
 3  * E13-数组-13. 螺旋方阵
 4  *  Created on: 2014年8月25日
 5  *******测试通过***********
 6  *
 7  */
 8 
 9 #include <stdio.h>
10 
11 int main(void) {
12 
13     int array[11][11];
14     int n; //题目中的N
15 
16     scanf("%d", &n);
17 
18     int upBound = 0; //上边界
19     int bottomBound = n - 1; //下边界
20     int leftBound = 0; //左边界
21     int rightBound = n - 1; //右边界
22     int num = 1; //矩阵的数值,从1开始
23     int i;
24 
25     while (upBound <= bottomBound && leftBound <= rightBound) {
26         for (i = leftBound; i <= rightBound; i++) {
27             array[upBound][i] = num;
28             num++;
29         }
30         if (upBound == bottomBound)
31             break;
32 
33         upBound++; //上边界下移一行
34         for (i = upBound; i <= bottomBound; i++) {
35             array[i][rightBound] = num;
36             num++;
37         }
38         if (leftBound == rightBound)
39             break;
40 
41         rightBound--; //右边界左移一行
42         for (i = rightBound; i >= leftBound; i--) {
43             array[bottomBound][i] = num;
44             num++;
45         }
46 
47         bottomBound--; //下边界上移一行
48         for (i = bottomBound; i >= upBound; i--) {
49             array[i][leftBound] = num;
50             num++;
51         }
52 
53         leftBound++; //左边界左移一行
54 
55     }
56     //输出矩阵
57     int j;
58     for (i = 0; i < n; i++) {
59         for (j = 0; j < n; j++) {
60             printf("%3d", array[i][j]);
61         }
62         printf("\n");
63     }
64 
65     return 0;
66 }

***

在这里声明一下,这道题目是我根据“YangKang”实现的C语言版本,但是因为我实在找不到网址了,所以下面我把“YangKang”的代码附上。如有知道具体网址的,还请告知于我,我会把出处添加上。

***

 1 /**
 2  * 问题描述:
 3  * 从键盘输入一个整数,
 4  * 则以该数字为矩阵的大小,把1,2,3,…,n*n 的数字按照顺时针螺旋的形式填入其中。
 5  * 例如:
 6  * 输入数字2,则程序输出:
 7  * 1 2
 8  * 4 3
 9  * 输入数字3,则程序输出:
10  * 1 2 3
11  * 8 9 4
12  * 7 6 5
13  * 输入数字4, 则程序输出:
14  *  1  2   3  4
15  * 12 13  14  5
16  * 11 16  15  6
17  * 10  9   8  7
18  *
19  * @author YangKang
20  *
21  */
22 import java.util.Scanner;
23 
24 public class Main {
25     public static void main(String[] args) {
26         Scanner keyin = new Scanner(System.in);
27 
28         System.out.println("请输入矩阵大小");
29         int n = keyin.nextInt();
30         if (n == 0)
31             System.exit(0);
32         int result[][] = new int[n][n];// 存放最后的螺旋数字方阵
33         /*
34          * 程序中首先从上届为0的行开始将数据存入result中。达到右边界n-1时,上届指针下移一行,
35          * 其他边界指针不动,此时行循环变量每次往下移动一行,列循环指针指向右边界不动,持续 插入递增的数字,
36          */
37         int upBound = 0;// 上届指针
38         int downBound = n - 1;// 下界指针
39         int leftBound = 0;// 左边界指针
40         int rightBound = n - 1;// 右边界指针
41         int num = 1;// 记录数字值,每插入一个,自增一次    
42         while (upBound <= downBound && leftBound <= rightBound) {
43             /*
44              * 横向从左到右将数字从小到大插入数组对应位置。 j代表列循环变量
45              */
46             for (int j = leftBound; j <= rightBound; j++) {
47                 result[upBound][j] = num;
48                 num++;// 数字记录自增
49             }
50             if (upBound == downBound)// 避免重复插入行
51                 break;
52             /*
53              * 一圈的最上一行插入完毕,开始向数组插入右侧列,方向为从上至下。 此时上届指针应该下移一行,其他指针不动,行循环变量逐层下移。
54              * i代表行循环变量
55              */
56             upBound++;// 上届下移一行
57             for (int i = upBound; i <= downBound; i++) {
58                 result[i][rightBound] = num;
59                 num++;
60             }
61             if (leftBound == rightBound)// 避免重复插入列
62                 break;
63             /*
64              * 一圈的右边界列插入完毕,开始向下边界行插入数字,方向为从右向左。 此时右边界指针左移一行,其他指针不动,列循环变量逐列向做移动。
65              * j代表列循环变量
66              */
67             rightBound--;// 右届左移一行
68             for (int j = rightBound; j >= leftBound; j--) {
69                 result[downBound][j] = num;
70                 num++;
71             }
72             /*
73              * 一圈的下边界行插入完毕,开始向左边界插入列数字,方向为从下往上。
74              * 此时下边界指针向上移动一行,其他指针不动,行循环变量逐层向上移动。 i代表行循环变量
75              */
76             downBound--;// 下界上移一行
77             for (int i = downBound; i >= upBound; i--) {
78                 result[i][leftBound] = num;
79                 num++;
80             }
81             /*
82              * 至此一圈的插入过程完成,重现continue开始进入下一圈的插入过程。 此时左边界指针需要重新调整,即需向右移动一行。
83              */
84             leftBound++;// 左边界右移一行
85         }
86 
87         /*
88          * 输出方阵螺旋数组
89          */
90         for (int i = 0; i < n; i++) {
91             for (int j = 0; j < n; j++) {
92                 System.out.print(result[i][j] + "\t");
93             }
94             System.out.println();
95         }
96     }
97 }

 

题目链接:

http://pat.zju.edu.cn/contests/basic-programming/%E6%95%B0%E7%BB%84-13

 

 

.

数组-13. 螺旋方阵

标签:style   blog   http   color   java   os   io   for   ar   

原文地址:http://www.cnblogs.com/boomkeeper/p/E13.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!