本文内容由课本改动一些而成。
螺旋数组中,对数组元素的赋值不是一行一行的,而是一圈一圈的,顺时针,由外向里。所有把所以的正方形圈圈都赋值完毕了,数组也就完成了。简单来讲,对于每一圈的四个顶点的坐标,在数组里的坐标,我们可以确定么?可以的。根据圈序号和数组大小,可以确定该圈的四个顶点的下标。同时,依此也确定了绘制四条边时的循环起始和终止值。同时也要做到4个循环连接时候的不重不漏,对数组赋值。
代码如下,见名知意,很好理解:
#include<iostream>
using namespace std;
#define MAXWIDTH 10
#include<stdio.h>
void screwArray(int array[MAXWIDTH][MAXWIDTH],int arraySize) {
int roundNumber = (arraySize % 2 == 0) ? arraySize / 2 : arraySize / 2 + 1;
//对于每个圈,都是可以根据其圈序号确定其四个顶点的坐标的,
//这也是绘制每个圈四条边时循环的起止点
int rank, colomn,count = 0;
for (int i = 0; i < roundNumber; i++) {
// compute up rank
for (rank = i,colomn = i; colomn < arraySize - i; colomn++) {
count++;
array[rank][colomn] = count;
}
//compute right colomn
for (rank = i + 1, colomn = arraySize - 1 - i;rank < arraySize - i;
rank++) {
count++;
array[rank][colomn] = count;
}
//compute bellow rank
for (rank = arraySize - 1 - i, colomn = arraySize - 2 - i;
colomn >= i; colomn--) {
count++;
array[rank][colomn] = count;
}
//compute left colomn
for (rank = arraySize - 2 - i, colomn = i; rank > i;rank--) {
count++;
array[rank][colomn] = count;
}
}
}
int main() {
int array[MAXWIDTH][MAXWIDTH];
int arraySize;
cout << "input the array arraySize (<10): ";
cin >> arraySize;
screwArray(array,arraySize);
cout << endl << "array is as follows :" << endl;
for (int i = 0; i < arraySize; i++) {
for (int j = 0; j < arraySize; j++)
printf("%5d", array[i][j]);
cout << endl << endl;
}
return 0;
}
测试结果如下: