螺旋方阵(注:编程题库)Description输出n圈的螺旋方阵.Input只有一行且只有一个正整数:n ( 1 < n < 10 )Output从左上角开始,每个数据占用4个字符位置,按顺时针方向输出Sample Input3Sample Output1 2 3 4
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/30 13:43:26
螺旋方阵(注:编程题库)Description输出n圈的螺旋方阵.Input只有一行且只有一个正整数:n ( 1 < n < 10 )Output从左上角开始,每个数据占用4个字符位置,按顺时针方向输出Sample Input3Sample Output1 2 3 4
螺旋方阵(注:编程题库)
Description
输出n圈的螺旋方阵.
Input
只有一行且只有一个正整数:n
( 1 < n < 10 )
Output
从左上角开始,每个数据占用4个字符位置,按顺时针方向输出
Sample Input
3
Sample Output
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
Source
基础题
螺旋方阵(注:编程题库)Description输出n圈的螺旋方阵.Input只有一行且只有一个正整数:n ( 1 < n < 10 )Output从左上角开始,每个数据占用4个字符位置,按顺时针方向输出Sample Input3Sample Output1 2 3 4
我是用C++实现的,编程语言不是界限啦~
首先,我的思路是这样的:
首先 给一个12*12的数组 全部赋值 为0
然后 把中间那个10*10的区域 全部赋值为-1(这样外面一圈是0,中间一块是-1)
这样 问题就转化为,向中间一块值为-1的区域 填充合适的螺旋矩阵元素值 对吧?
好,然后填充的时候,初始方向为→
1. 按→方向填充,当数组元素值不是-1时,切换方向到 ↓
2. 继续沿 ↓ 填充,当数组元素值不是-1时,切换方向为←
3. 继续沿←填充,当数组元素值不是-1时,切换方向为 ↑
4. 继续沿 ↑ 填充,当数组元素值不是-1时,切换方向为→(回到第1步)
如果理解这个想法,那么编程就不是特别难,细心一点,调整控制游标就行~
下面是我自己写的代码,参考一下吧~
#include <iostream>
#include <iomanip>
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 < N*N ) { //当填充的值cnt涨到N*N时,填充完毕后退出循环...
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 << "Error..." << endl;
break;
}
}
//打印数组
for( i = 1; i <= N; i++ )
{
//为了输出美观,我用了setfill('0')填充空位,你可以去掉
for( j = 1; j <= N; j++ )
cout << setfill('0') << setw(2) << a[i][j] << " ";
cout << endl;
}
}
return 0;
}
接下来,是运行结果截图(界面还是比较粗糙的.):