问题链接: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; }