数组-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; //题目中的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

.

时间: 2024-08-24 16:49:47

数组-13. 螺旋方阵的相关文章

数组-13. 螺旋方阵(20)

所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里.本题要求构造这样的螺旋方阵. 输入格式: 输入在一行中给出一个正整数N(<10). 输出格式: 输出NxN的螺旋方阵.每行N个数字,每个数字占3位. 输入样例: 5 输出样例: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 1 #include <iostream> 2 #includ

c和c++的一些训练题(10)(打印螺旋方阵)

问题的提出:编写螺旋方阵.其中螺旋方阵形式如下: 1  12 11  10 2  13 16   9 3  14 15   8 4   5   6    7 设row,column分别代表行.列坐标,变量p从1到n2将p依次存入数组a[row][column]中,要确定row.colomn的变化情况.分析如下:引进变量k,初值为n.当数据存入到左下角或右上角时,k减1,这样可保证输出时方阵.引进变量t,初值为1,当数据存入到右下角时,令t改变符合,当存入到左上角时,t又改变符合,这样可保证赋值到

PAT - IO - 螺旋方阵

所谓“螺旋方阵”,是指对任意给定的N,将1到N*N的数字从左上角第1个格子开始,按顺时针螺旋方向顺序填入NxN的方阵里.本题要求构造这样的螺旋方阵. 输入格式: 输入在一行中给出一个正整数N(<10). 输出格式: 输出NxN的螺旋方阵.每行N个数字,每个数字占3位. 输入样例: 5 输出样例: 1 2 3 4 5 16 17 18 19 6 15 24 25 20 7 14 23 22 21 8 13 12 11 10 9 实现: #include "stdafx.h" #de

1490 数据结构:螺旋方阵

1 #include <iostream> 2 #define MAX_SIZE 100+1 3 using namespace std; 5 int array[MAX_SIZE][MAX_SIZE]; 6 int creatScrewMatrix(int n) 7 { 8 int upBound=0,downBound=n-1,leftBound=0,rightBound=n-1;//上下左右边界初始化 9 int num=1; 10 while(upBound<=downBound

1807: 【基础】螺旋方阵

program ex1807;var n,i,j,t,f,l,q,z:integer;s1,s2:longint; a:array[1..20,1..20] of integer;begin readln(n); t:=1; f:=1; l:=n;i:=1;q:=1;z:=n; while t<=n*n do begin case f of 1:begin for j:=q to z do begin a[i,j]:=t;inc(t);end; f:=2; q:=i+1;dec(l); z:=l

[leetcode]54. Spiral Matrix二维数组螺旋取数

import java.util.ArrayList; import java.util.List; /** * Given a matrix of m x n elements (m rows, n columns), * return all elements of the matrix in spiral order. For example, Given the following matrix: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] You

【Java学习笔记之八】java二维数组及其多维数组的内存应用拓展延伸

多维数组声明 数据类型[][] 数组名称; 数据类型[] 数组名称[]; 数据类型数组名称[][]; 以上三种语法在声明二维数组时的功能是等价的.同理,声明三维数组时需要三对中括号,中括号的位置可以在数据类型的后面,也可以在数组名称的后面,其它的依次类推. 例如: int[][] map; char c[][]; 和一维数组一样,数组声明以后在内存中没有分配具体的存储空间,也没有设定数组的长度.  -------------------------------------------------

蛇形矩阵 和螺旋矩阵

1.蛇形方阵: 1  2  3 6  5  4 7  8  9 外层控制层数,内层根据列数控制方向:0 则往右走   N-1则往左走 #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 100 int a[SIZE][SIZE]; int main(int argc, const char *argv[]) { int dim = atoi(argv[1]); int i, j,

3、软件工程结对开发之求一维数组中连续最大子数组之和并判断溢出

一.题目要求 题目:返回一个整数数组中最大子数组的和. 要求: 要求程序必须能处理1000 个元素: 每个元素是int32 类型的: 输入一个整形数组,数组里有正数也有负数: 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和: 求所有子数组的和的最大值.要求时间复杂度为O(n): 结果溢出之后能判断. 二.设计思想 在我们的前一个程序中,由于int类型rand()随机产生数范围是0~32767,所以产生的1000个数较小,不会产生溢出.但我们通过查资料得知int32最大数是2147