zigzag数组,输入n,求一个n x n矩阵,规定矩阵沿45度线递增,形成一个zigzag数组
2017-02-01 23:36
274 查看
输入n,求一个n x n矩阵,规定矩阵沿45度线递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用c++实现?[中国台湾著名硬件公司2007年11月面试题]
0 1 5 6 14 15 27
2 4 7 13 16 26 28
3 8 12 17 25 29 38
9 11 18 24 30 37 39
10 19 23 31 36 40 45
20 22 32 35 41 44 46
21 33 34 42 43 47 48
上面数字的排列方式就是zigzag数组的排列方式
书上的解法:
另外一种方法
package com.example.test;
import java.util.Scanner;
public class ZigzagArray2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
n = sc.nextInt();
int[][] a = new int
;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
int s = i + j;
if(s < n) {
int t = (s * (s + 1)) / 2;
if(s % 2 == 1) {
a[i][j] = t + i;
} else {
a[i][j] = t + j;
}
}
}
}
//上半部跟下半部存在一定的对称关系
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
int s = i + j;
int t = n * n -1;
if(s >= n) {
int b = n - i - 1;
int c = n - j - 1;
a[i][j] = t - a[b][c];
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.printf("%6d", a[i][j]);
}
System.out.println();
}
}
}
0 1 5 6 14 15 27
2 4 7 13 16 26 28
3 8 12 17 25 29 38
9 11 18 24 30 37 39
10 19 23 31 36 40 45
20 22 32 35 41 44 46
21 33 34 42 43 47 48
上面数字的排列方式就是zigzag数组的排列方式
书上的解法:
package com.example.test; import java.util.Scanner; public class ZigzagArray { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N; int s; N = sc.nextInt(); int squa = N * N; int[][] a = new int ; for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { s = i + j; if(s < N) { a[i][j] = s * (s + 1)/2+(((i+j) % 2 == 0) ? i : j); } else { s = (N - 1 - i) + (N - 1- j); a[i][j] = squa - s * (s + 1) /2 - (N - (((i + j) %2 == 0)? i : j)); } } } for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { System.out.printf("%6d", a[i][j]); } System.out.println(); } } }
另外一种方法
package com.example.test;
import java.util.Scanner;
public class ZigzagArray2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n;
n = sc.nextInt();
int[][] a = new int
;
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
int s = i + j;
if(s < n) {
int t = (s * (s + 1)) / 2;
if(s % 2 == 1) {
a[i][j] = t + i;
} else {
a[i][j] = t + j;
}
}
}
}
//上半部跟下半部存在一定的对称关系
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
int s = i + j;
int t = n * n -1;
if(s >= n) {
int b = n - i - 1;
int c = n - j - 1;
a[i][j] = t - a[b][c];
}
}
}
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
System.out.printf("%6d", a[i][j]);
}
System.out.println();
}
}
}
相关文章推荐
- zigzag数组:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组
- 对面试题“输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现?”的理解
- 输入n,求一个n×n矩阵,规定矩阵沿45度递增,形成zigzag数组
- 面试例题:输入n,求一个n x n矩阵,规定矩阵沿45度递增,形成一个zigzag数组(JPEG编码里取像素数据的排列顺序),请问如何用C++实现? (中国台湾著名硬件公司2007年11月面试题)
- zigzag数组:输入n,求一个nXn矩阵,规定矩阵沿45度递增,形成一个zigzag数组
- 用c++实现一个n*n矩阵,矩阵沿着45度递增,形成zigzag数组
- 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都依照从左到右的递增的顺序排序,输入这种一个数组和一个数,推断数组中是否包括这个数
- 【c语言】二维数组中的查找,杨氏矩阵在一个二维数组中,每行都按照从左到右的递增的顺序排序,输入这样的一个数组和一个数,判断数组中是否包含这个数
- 输入n求N*N矩阵,规定矩阵沿45度线递增
- 【C语言】求旋转数组的最小数字,输入一个递增排序的数组的一个旋转,输出其最小元素
- 输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请按成 一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 输入一个递增排序的数组和一个数字s,在数组中寻找两个数,使得这两个数的和为s
- 【算法】 输入n 输出一个n*n的zigzag矩阵 利用c++实现
- 2. 有一个二维数组.----杨氏矩阵 。数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。 时间复杂度小于O(N);
- 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 输入一个递增排序的数组和一个数字sum,在数组中查找两个数,使得他们的和正好是sum
- 输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。