优质解答
我是用C++实现的,编程语言不是界限啦~
首先,我的思路是这样的:
首先 给一个12*12的数组 全部赋值 为0
然后 把中间那个10*10的区域 全部赋值为-1(这样外面一圈是0,中间一块是-1)
这样 问题就转化为,向中间一块值为-1的区域 填充合适的螺旋矩阵元素值 对吧?
好,然后填充的时候,初始方向为→
1. 按→方向填充,当数组元素值不是-1时,切换方向到 ↓
2. 继续沿 ↓ 填充,当数组元素值不是-1时,切换方向为←
3. 继续沿←填充,当数组元素值不是-1时,切换方向为 ↑
4. 继续沿 ↑ 填充,当数组元素值不是-1时,切换方向为→(回到第1步)
如果理解这个想法,那么编程就不是特别难,细心一点,调整控制游标就行~
下面是我自己写的代码,参考一下吧~
#include
#include
using namespace std;
int a[12][12];
int main() {
int N;
int cnt;
int i, j; //数组操作的下标
int dir;
int k, p; //填充操作的游标
while( cin >> N ) {
cnt = 0; //待填充的值
//1. 将数组全部初始化为0
memset( a, 0, sizeof(a) );
//2. 再将中间的方块[1...N][1...N]初始化为-1
// 这样,任务就转化为,将中间值为-1的部分填充为合适的螺旋矩阵元素
for( i = 1; i <= N; i++ )
for( j = 1; j <= N; j++ )
a[i][j] = -1;
//方向向量,指定螺旋填充方向
dir = 0;
k = 1;
p = 1;
while( cnt
switch( dir ) {
//方向值dir为0,从左向右填充 数组a[][]中值为-1的部分
case 0:
a[k][p++] = ++cnt;
if( a[k][p] != -1 ) {
dir = 1;
p--;
k++;
}
break;
//方向值dir为1时...下面类似
case 1:
a[k++][p] = ++cnt;
if( a[k][p] != -1 ) {
dir = 2;
p--;
k--;
}
break;
case 2:
a[k][p--] = ++cnt;
if( a[k][p] != -1 ) {
dir = 3;
k--;
p++;
}
break;
case 3:
a[k--][p] = ++cnt;
if( a[k][p] != -1 ) {
dir = 0;
p++;
k++;
}
break;
default:
cout <
break;
}
}
//打印数组
for( i = 1; i <= N; i++ )
{
//为了输出美观,我用了setfill('0')填充空位,你可以去掉
for( j = 1; j <= N; j++ )
cout <
cout <
}
}
return 0;
}
接下来,是运行结果截图(界面还是比较粗糙的.):