问题链接: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("\n");
}
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;
}