首页 > 代码库 > 数组-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. 螺旋方阵
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。