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
.
首先要明確,在JavaScript裡面沒有二維數組的概念,只能用普通數組來模擬出二維數組的效果。
其次,對二維數組進行分析,可以得出循環的次數的規律,即偶數/2或者奇數對2取整後加1。
再次,可以看出方陣是從右下角開始,逆時針逐漸增加得來。
那麼,可以寫出以下函數:
function printAll(number ,start){
//number為N階矩陣,start為開始的數字,默認值分別是5和1。
number = number || 5;
start = start || 1;
// c為求出的循環次數
var c = number%2 == 0 ? number/2 : Math.ceil(number/2);
// 定義一個一維數組,方便生成二維數組
var arr = [];
// 生成二維數組並初始化,值為0
for( var i = 0; i < number; i++){
arr[i] = [];
for(var j = 0 ; j < number; j++){
arr[i].push(0);
}
}
// 循環一次的函數
function circle(c){
// 從下往上賦值
for( i = number - c - 1; i >= c; i--){
arr[i][number - c - 1] = start++;
}
// 從右往左賦值
for(i = number - c - 2; i >= c; i--){
arr[c][i] = start++;
}
// 從上往下賦值
for( i = c + 1; i < number - c; i++){
arr[i][c] = start++;
}
// 從左往右賦值
for(i = c + 1; i < number -c - 1; i++){
arr[number - c - 1][i] = start++;
}
}
// 循環給數組賦值
for(j = 0; j < c; j++){
circle(j);
}
// 在控制台查看生成的數組信息,可注釋掉
for( i = 0; i < number; i++){
console.log(arr[i]);
}
}
希望可以幫到你,思路和函數全給你了...余下全文>>
main()
{
int i,j,k,m=1,n,a[100][100];
j=0;k=0;
scanf("%d",&n);
while(k<=(n+2)/2)
{
j=k;
for(i=k;i<=n-k-1;i++)
{
a[i][j]=m;
m++; }
i=n-k-1;
for(j=k+1;j<=n-k-1-1;j++)
{
a[i][j]=m;m++;
}
j=n-k-1;
for(i=n-k-1;i>=k;i--)
{
a[i][j]=m;m++;}
i=k;
for(j=n-k-1-1;j>=k+1;j--)
{ a[i][j]=m; m++;}
k++;
}
if(n%2!=0)
a[(n-1)/2][(n-1)/2]=a[(n-1)/2][(n-1)/2]-1;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}