/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、不用数组存储,根据行号和列号直接计算出相关的数字并打印(解题代码稍后补充)