CodeVs 蛇形矩阵

题目链接:http://codevs.cn/problem/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

<算法竞赛入门经典>一书中有一道类似的题目:

在n*n方陈里填入1,2,...,n*n,要求填成蛇形。例如n=4时方陈为:
10 11  12  1
 9 16  13  2
 8 15  14  3
 7  6   5  4

解法:参照http://blog.csdn.net/todd911/article/details/7926042

写的非常详细,我也是看完才写出这道题,刚开始写还把题目理解错了。

上面的解法思想就是分步判断。

外循环以圈数做循环,内部分为4并列循环,分别填充4条边。

借鉴这个解法:本题,从内向外。一个循环,填充一圈

#include  <iostream>
#include <vector>

using namespace std;
int main(){
    int n =3;
    cin >> n;
    int r = n / 2;//圈数
    int index = 1;//数字,内循环一次++,作为要填充的值;
    //int m[3][3] = { 0 };//例:m[3][5] 表示3行5列。
    vector<vector<int> > m(n);//v为容器的容器,作为横列rows.
    for (int i = 0; i<n; i++)
        m[i].resize(n);//里层容器大小设置为纵列cols

    int x = n / 2;//纵列cols
    int y = n / 2;//横列rows

    m[x][y] = 1; //填充中心。题目范围已给定,n为奇数。

    //开始填充矩阵
    for (int i = 0; i < r; i++)//一圈一圈的循环
    {
        int a = 2 * i + 1;
        int b = 1 + 2 * (i + 1);
        int start = a * a;//每圈开始值 i = 1,start = 9
        int end = b * b;//每圈结束值 i = 1,end =  25
        int slide = 2 * (i + 1) + 1;
        for (int k = 0; k < end - start; k++)
        {
            index++;
            if (k == 0){
                x++;
            }
            if (k < slide - 1 && k >0){//1.
                y--;
            }
            else if (k < 2 * slide - 2 && k  >0){//2.
                x--;
            }
            else if (k < 3 * slide - 3 && k  >0){//3.
                y++;
            }
            else if (k < 4 * slide - 4 && k  >0){//4.
                x++;
            }
             m[y][x] = index;

        }
    }// 外循环

    //开始计算对角线之和
    int sum = 0;
    for (int j = 0; j < n; j++)
    {
        sum += m[j][j] + m[n - j - 1][j];//前一个为正对角线,后一个为邪对角线。+1重叠了,最后要 -1
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            cout << m[i][j] << " ";
        }
        cout << ‘\n‘;
    }
    sum--;
    cout << sum;
    //system("pause");
    return 0;
}

写的不够好的地方,还望指正 :)

时间: 2024-10-10 21:07:06

CodeVs 蛇形矩阵的相关文章

蛇形矩阵

如上图所示,是一个4*4的蛇形矩阵 算法思路 由图可观察到该矩阵可分为上三角和下三角.每个三角要根据蛇形的奇偶行进行计数. 算法代码 #include <stdio.h> int main() { int a[10][10]; int n; printf("Input n:"); scanf("%d",&n); int i=0,j=0,k=0; int count=1; for(i=0;i<n;i++)/*上三角 i代表是蛇形的奇偶行*/

随便写的蛇形矩阵

[问题描述] 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. [要求] [数据输入]本题有多组数据,每组数据由一个正整数N组成.(N不大于100) [数据输出]对于每一组数据,输出一个N行的蛇形矩阵.两组输出之间不要额外的空行.矩阵三角中同一行的数字用一个空格分开.行尾不要多余的空格. [样例输入] 5 [样例输出] 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 /*作者:Yosha*/ #include "stdio.h" int main() {

(水题)蛇形矩阵

1160 蛇形矩阵 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 小明玩一个数字游戏,取个n行n列数字矩阵(其中n为不超过100的奇数),数字的填补方法为:在矩阵中心从1开始以逆时针方向绕行,逐圈扩大,直到n行n列填满数字,请输出该n行n列正方形矩阵以及其的对角线数字之和. 输入描述 Input Description n(即n行n列) 输出描述 Output Description n+1行,n行为组成的矩阵,最后一行为

Java编码 蛇形矩阵的构建与遍历输出

一.蛇形矩阵的构建,并按行输出 例: 输入:n, 生成n*n的蛇形矩阵 1 2 3 8 9 4 7 6 5 输出:1 2 3 8 9 4 7 6 5 java编码 public static void main(String[] args) { // TODO Auto-generated method stub Scanner in = new Scanner(System.in); int n = in.nextInt(); if(n < 0) return; if(n == 1){ Sys

蛇形矩阵与螺旋矩阵

自己写的蛇形矩阵:(蛇形矩阵就是在NXN矩阵格子上从左上到右下以"之"字型增加或减少,像蛇盘绕着的形状.本程序从左上开始盘旋一直到右下达到最大值) #include <iostream> using namespace std; #define n 10//输入要更改的矩阵大小 void main() { int a[n][n]={0},k=1,j=0,i=0,s1[4]={0,1,2,3},t1[4]={1,1,2,2},m=0; for (int t=1;t<=n

1010: 蛇形矩阵

Description 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. Input 本题有多组数据,每组数据由一个正整数N组成.(N不大于100) Output 对于每一组数据,输出一个N行的蛇形矩阵.两组输出之间不要额外的空行.矩阵三角中同一行的数字用一个空格分开.行尾不要多余的空格. Sample Input 5 Sample Output 1 3 6 10 152 5 9 144 8 137 1211 <pre name="code" class="cp

华为OJ——蛇形矩阵

题目描述 题目说明 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. 样例输入 5 样例输出 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 接口说明 原型 void GetResult(int Num, char * pResult); 输入参数: int Num:输入的正整数N 输出参数: int * pResult:指向存放蛇形矩阵的字符串指针 指针指向的内存区域保证有效 返回值: void 输入描述: 输入正整数N(N不大于100) 输出描述: 输出一个N

第3章第1节练习题1 蛇形矩阵

问题描述 蛇形矩阵即使用二维数组完成来回曲折的赋值,举例说明如下所示的形式即为蛇形数组. 算法思想 观察该二维数组,只是可以"人为"的发现它就像一条蛇的形状来回爬行,然而并没有什么卵用,不能明确的站在计算机的角度上来实现这个数组.于是将所有的下标列出来便可以得到下述所述的曲线走势. 然后结合第一张图便可以发现 数字从2~3的过程中,下标行变化范围是0~1:下标列范围是1~0: 数字从4~6的过程中,下标行变化范围是2~0:下标列范围是0~2: 数字从7~10的过程中,下标行变化范围是0

ACM编程比赛入门题目之蛇形矩阵

蛇行矩阵 [问题描述] 蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形. [要求] [数据输入]本题有多组数据,每组数据由一个正整数N组成.(N不大于100) [数据输出]对于每一组数据,输出一个N行的蛇形矩阵.两组输出之间不要额外的空行.矩阵三角中同一行的数字用一个空格分开.行尾不要多余的空格. [样例输入] 5 [样例输出] 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 代码: #include <iostream> using namespace std