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");
}
}