程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 數組-13. 螺旋方陣,數組-13螺旋方陣

數組-13. 螺旋方陣,數組-13螺旋方陣

編輯:關於C語言

數組-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; //題目中的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利用二位數組打印n階矩形螺旋方陣,如下 n=5 9 8 7

首先要明確,在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");
}
}
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved