zoukankan      html  css  js  c++  java
  • CCF NOI1046 打印方阵

    问题链接CCF NOI1046 打印方阵




    时间限制: 1000 ms  空间限制: 262144 KB

    题目描述

      打印一个n*n的数字方阵,例如n=4时:(n<=100)
    1  3    4   10
    2  5    9   11
    6  8    12   15
    7  13   14   16

    输入

      输入n。

    输出

      输出n*n的方阵。

    样例输入

    4
    样例输出

    1 3 4 10
    2 5 9 11
    6 8 12 15
    7 13 14 16

    数据范围限制

     




    问题分析

      这个问题是要将1-n*n的数,按照一定规律(原题没有详细说明,只是给出了一个样例)填入n*n的矩阵中。这个规律需要自己看出来。

      这个问题的关键是,如何1-n*n的数与二维下标的映射关系,找出规律问题就简单了。

    程序说明

      这里除了给出上述思路的C语言程序外,另外给出一个其他思路的C++语言程序,逻辑上更加易懂。

    要点详解
    • 虽然题意中给的是常量的矩阵大小,可以用字符常量来定义数组,但是用宏来定义一个符号常量更为合理
    • 1-n*n的数与二维下标的映射关系。一些映射关系用数学函数表达是困难的,而用程序来描述并不困难。
    • 矩阵是数学上的概念,二维数组是程序中的概念。编写程序时,矩阵可以用二维数组来存储和表示。



    参考链接CCF201412-2 Z字形扫描(100分)

    100分通过的C语言程序:

    #include <stdio.h>
    
    #define N 100
    
    int a[N][N];
    
    int main(void)
    {
        int n, i, j, val, n1;
    
        // 输入n
        scanf("%d", &n);
    
        // 设置左上三角的值
        val = 1;
        for(i=0; i<n; i++)
            for(j=0; j<=i; j++) {
                if(i % 2)
                    a[i - j][j] = val;
                else
                    a[j][i - j] = val;
                val++;
            }
    
        // 设置右下三角的值
        val = n * n;
        n1 = n - 1;
        for(i=0; i<n1; i++)
            for(j=0; j<=i; j++) {
                if(i % 2)
                    a[n1 - i + j][n1 - j] = val;
                else
                    a[n1 - j][n1 - i + j] = val;
                val--;
            }
    
        // 输出结果
        for(i=0; i<n; i++) {
            for(j=0; j<n; j++)
                printf("%d ", a[i][j]);
            printf("
    ");
        }
    
        return 0;
    }

    100分通过的C++语言程序:

    #include <iostream>
    
    using namespace std;
    
    const int SOUTH = 0;
    const int EAST = 1;
    const int SOUTHEAST = 2;
    const int NORTHWEST = 3;
    
    struct {
        int drow;
        int dcol;
    } direct[] = { { 1, 0 }, { 0, 1 }, { -1, 1 }, { 1, -1 } };
    
    const int N = 100;
    
    int a[N][N];
    
    int main()
    {
        int n, val=1;
        cin >> n;
    
        // Z字形输出结果
        int row = 0, col = 0, next = SOUTH;
        a[row][col] = val;
    
             while (row != n - 1 || col != n - 1) {
                 val++;
                 row += direct[next].drow;
                 col += direct[next].dcol;
                 a[row][col] = val;
    
                 if (next == SOUTH && col == 0)
                     next = SOUTHEAST;
                 else if (next == SOUTH && col == n - 1)
                     next = NORTHWEST;
                 else if (next == EAST && row == 0)
                     next = NORTHWEST;
                 else if (next == EAST && row== n - 1)
                     next = SOUTHEAST;
                 else if (next == SOUTHEAST && col == n - 1)
                     next = SOUTH;
                 else if (next == SOUTHEAST && row == 0)
                     next = EAST;
                 else if (next == SOUTHEAST&& row != 0)
                     next = SOUTHEAST;
                 else if (next == NORTHWEST && row == n - 1)
                     next = EAST;
                 else if (next == NORTHWEST&& col !=0)
                     next = NORTHWEST;
                 else if (next == NORTHWEST && col== 0)
                     next = SOUTH;
        }
    
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++)
                cout << a[i][j] << " ";
            cout << endl;
        }
    
        return 0;
    }




  • 相关阅读:
    第一个Servlet项目(IDEA)
    Web交互基本流程以及HTTP协议详解
    mybatis中Mapper.xml配置详解
    认识mybatis
    SpringAOP
    Spring AOP
    70. Climbing Stairs
    位运算
    Leetcode分类
    21. Merge Two Sorted Lists
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563903.html
Copyright © 2011-2022 走看看