作业帮 > 综合 > 作业

螺旋方阵(注:编程题库)

来源:学生作业帮 编辑:作业帮 分类:综合作业 时间:2024/08/29 19:53:43
螺旋方阵(注:编程题库)
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
基础题
我是用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;
}
 
 
接下来,是运行结果截图(界面还是比较粗糙的.):