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;
}




原文地址:https://www.cnblogs.com/tigerisland/p/7563903.html