NYOJ 33-蛇形填数

时间限制:3000 ms | 内存限制:65535 KB | 难度:3

描述

在$n×n$方阵里填入$1,2,…,n×n$,要求填成蛇形。例如$n=4$时方阵为:

$$
\begin{matrix}
10 & 11 & 12 & 1 \\
9 & 16 & 13 & 2 \\
8 & 15 & 14 & 3 \\
7 & 6 & 5 & 4 \\
\end{matrix}
$$

输入

直接输入方阵的维数,即n的值。(n<=100)

输出

输出结果是蛇形方阵。

样例输入

3

样例输出

7 8 1
6 9 2
5 4 3

题目来源

http://acm.nyist.net/JudgeOnline/problem.php?pid=33

程序实现:分治法实现数字旋转方阵

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <iostream>
using namespace std;

int **data;
//number:要填的数值,begin:每一层的起始位置(i),size:方阵的大小
void Full(int number, int begin, int size){
//从number开始填写size阶方阵,右上角的下标(begin,begin+size-1)
int i,j,k;
if(size==0) return;
if(size==1){
data[begin][begin] = number;
return;
}
i = begin; j = begin+size-1;//初始化右上角坐标
for(k=0; k<size-1; k++){
data[i][j] = number;
number++;i++;
}
for(k=0; k<size-1; k++){
data[i][j] = number;
number++;j--;
}
for(k=0; k<size-1; k++){
data[i][j] = number;
number++;i--;
}
for(k=0; k<size-1; k++){
data[i][j] = number;
number++;j++;
}
Full(number, begin+1,size-2);//递归
}

int main(){
int num;
cin>>num;
data = new int *[num];
for(int i=0; i<num; i++) data[i] = new int[num];
Full(1,0,num);
for(int i=0; i<num; i++){
for(int j=0; j<num; j++)
cout<<data[i][j]<<" ";
cout<<endl;
}
return 0;
}

C++ 全局二维数组

C/C++无法声明一个全局不定大小的二维数组,不过可以用二级指针来模拟

1
2
3
4
5
6
7
8
9
int **data; //声明二级指针data,指向一个指针数组(切记不是指向一个二维数组)

int main(){
int M,N;
cin >> M >> N; //输入两个维度
data = new int *[M]; //开辟指针数组
for(i=0; i<M; i++)
data[i] = new int[N];
//这样以后使用data[i][j]就像二维数组一样

文章目录
  1. 1. 程序实现:分治法实现数字旋转方阵
  2. 2. C++ 全局二维数组

20160315-acm-4/

本页二维码