首页 > 代码库 > 数组-13. 螺旋方阵

数组-13. 螺旋方阵

 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; //题目中的N15 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 311  * 8 9 412  * 7 6 513  * 输入数字4, 则程序输出:14  *  1  2   3  415  * 12 13  14  516  * 11 16  15  617  * 10  9   8  718  *19  * @author YangKang20  *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. 螺旋方阵