codevs1160-蛇形矩阵(螺旋矩阵)

来源:互联网 发布:大连民族大学网络教学 编辑:程序博客网 时间:2024/06/08 01:04

小明玩一个数字游戏,取个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

在网上看见有一种螺旋矩阵,是从外往里转,这个是从里往外转,也许这个题目叫螺旋矩阵会比较合适吧,上代码。

#include <iostream>#include<algorithm>#include<memory.h>using namespace std;int n;int a[101][101];int num = 1;//记录当前的数字int row=50, col=50;//记录当前的行列号int sum = 1;//记录对角线的和int flag[4];//对四角的数字进行标记int main(){a[50][50] = 1;//将中心初始化为1cin >> n;for (int i=3;i<=n;i=i+2){memset(flag, 0, sizeof(flag));col++;//每一圈的开始都是要先向右走一步num++;a[row][col] = num;for (int j=1;j<(i-1)*4;j++)//计算可知每一圈元素的个数为4*n-4,减去的4是重复计算的,n圈的大小{//整个循环进行4*(i-1)-1次,因为在外面已经走了一步if (j < i - 1){//向上走row--;num++;a[row][col] = num;}else if (j < 2 * (i - 1)){//向左走if (flag[0]==0){flag[0] = 1;sum += num;//右上角}col--;num++;a[row][col] = num;}else if (j < 3 * (i - 1)){//向下走if (flag[1] == 0){flag[1] = 1;sum += num;//左上角}row++;num++;a[row][col] = num;}else{//向右走if (flag[2] == 0){flag[2] = 1;sum += num;//左下角}col++;num++;a[row][col] = num;}}sum += num;//右上角}for (int i=50 - n / 2;i<= 50 + n / 2;i++){for (int j= 50 - n / 2;j<= 50 + n / 2;j++)cout << a[i][j] << " ";cout << endl;}cout << sum;cin >> n;return 0;}



原创粉丝点击