回形矩阵,1160蛇形矩阵打印

/p

1160 蛇形矩阵

题目描述 Description

小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和.

输入描述 Input Description

n(即n行n列)

输出描述 Output Description

n+1行,n行为组成的矩阵,最后一行为对角线数字之和

样例输入 Sample Input

3

样例输出 Sample Output

5 4 3
6 1 2
7 8 9
25


解题思路:
 由于打印顺序和矩阵的数字方式不一致,因此有A、B两种思路:
A、设立数组,模拟创建蛇形(回形)矩阵的方式,将数据填入数组中,最后打印出来
即以矩阵中心为出发点:依次右移1格,上移1格,左移2格,下移2格,右移3格,上移3格,左移4格,下移4格······
因此用0、1、2、3分别代表方向,代码中用了dir%4来表示方向(dir记录已经经历了多少次方向的变换),d=(dir+2)/2来表示某个方向需要移动的格数
num来记录某个方向已经移动的格数
      程序步骤:
     1、输入行数n,计算出填写的最大数字n*n
     2、for循环对每个数字i,计算出在矩阵中的位置
           即根据A中规律来计算
          判断是否为对角线上元素,则累加
     3、循环输出矩阵
#include<iostream>
#include<iomanip>
using namespace std;
int a[100][100];
int main()
{
    int n;
    while(cin>>n)
    {
        int dir = 0, d = (dir + 2) / 2;
        int num = 0, s = 1;
        int x = (n - 1) / 2, y = x;
        a[x][y] = 1;
        for(int i = 2; i <= n * n; i++)
        {//计算i的位置,并填入 
            switch(dir % 4)
            {
                case 0: y++;//右移一格 
                        break;
                case 1: x--;//上移 
                        break;
                case 2: y--;//左移 
                        break;
                case 3: x++;//下移 
                        break;
                default: break;
            }
            a[x][y] = i;num++;
            if(x == y || x + y == n-1)
               s+=a[x][y];
            if(num == d)
            {//改变状态 
                dir++;
                d = (dir + 2) / 2;
                num = 0;
            }
        }
        for(int i = 0; i < n; i++)
        {
            for(int j = 0; j < n; j++)
               cout<<setw(6)<<a[i][j];
            cout<<endl;
        }
        cout<<s<<endl;
    }
}

结果如下:


B、不用数组存储,根据行号和列号直接计算出相关的数字并打印(解题代码稍后补充)

 

posted @ 2017-10-22 11:35  hui666  阅读(860)  评论(0编辑  收藏  举报