Zigzag数组

首先了解下zigzag数组,如下图,由一个矩阵的对角线,数字按一定规律递增

求nxn的Zigzag数组?

代码如下:

/*

0     1     5     6     14    15    27    28
2     4     7     13    16    26    29    42
3     8     12    17    25    30    41    43
9     11    18    24    31    40    44    53
10    19    23    32    39    45    52    54
20    22    33    38    46    51    55    60
21    34    37    47    50    56    59    61
35    36    48    49    57    58    62    63

*/

class Zigzag{
	public static void main(String[] args){
		//int[][] a=nzigzag(8);
		int[][] a=zigzag2(8);
		print(a);
	}
	//解法一:
	public static int[][] nzigzag(int n){
		int[][] a=new int[n][n];
		int count=0; //记录当前应当填充的元素
		int cross=0;
		//填充左上三角矩阵,包括对角线,按斜线输出,cross表示的是第几条斜线
    	//对于任意一个元素a[i][j],有i+j = cross
		for(cross=0;cross<n;cross++){
			//如果填充第偶数条斜线,那么输出的方向是做左下角到右上角,终止的条件是行号i==0,或者列好j==N-1
			if(cross%2==0){
				for(int row=cross;row>=0;row--){
					a[row][cross-row]=count++;
				}
			}else{ //如果填充第奇数数条斜线,那么输出的方向是做右上角到左下角
				for(int col=cross;col>=0;col--){
					a[cross-col][col]=count++;
				}
			}
		}
		//填充右下角矩阵,不包括对角线
		int limit=1; //记录终止的行列号
		for(cross=n-2;cross>=0;cross--){
			if(cross%2==0){
				for(int row=n-1;row>=limit;row--){
					a[row][limit+n-1-row]=count++;
				}
				limit++;
			}
			else{
				for(int col=n-1;col>=limit;col--){
					a[limit+n-1-col][col]=count++;
				}
				limit++;
			}
		}
		return a;
	}
	//解法二:
	public static int[][] zigzag2(int n){
		int value=0;
		int num;
		int i,j,k;
		for(i=0;i<n;i++){
			num=0;
			if(i%2==0){
				j=i;
				k=0;
				while(num++<=i){
					a[j--][k++]=value++;
				}
			}else{
				j=0;
				k=i;
				while(num++<=i){
					a[j++][k--]=value++;
				}
			}
		}

		//下三角
		for(i=n-2;i>=0;i--){
			num=0;
			if(i%2==0){
				j=n-1;
				k=n-1-i;
				while(num++<=i){
					a[j--][k++]=value++;
				}
			}else{
				j=n-1-i;
				k=n-1;
				while(num++<=i){
					a[j++][k++]=value++;
				}
			}
		}
		return a;
	}

	public static void print(int[][] a){
		for(int i=0;i<a.length;i++){
			for(int j=0;j<a[0].length;j++){
				System.out.print(a[i][j]+" ");
			}
			System.out.println();
		}
	}
}

---EOF---

Zigzag数组,布布扣,bubuko.com

时间: 2024-10-12 21:17:19

Zigzag数组的相关文章

打印zigzag数组

今天花了不少时间来研究如何打印一个之字形zigzag矩阵,参考了下http://blog.163.com/[email protected]/blog/static/4741291720117842634276/,具体思路和程序在下面. // test2.cpp : 定义控制台应用程序的入口点. //Date:2015年6月17日 //Author: jsalienzy /* 0 1 5 6 14 15 27 28 * 2 4 7 13 16 26 29 42 * 3 8 12 17 25 30

用c++实现一个n*n矩阵,矩阵沿着45度递增,形成zigzag数组

#include<stdio.h> #include<iostream> using namespace std; int main() { int N; int s, i, j; int squa; cin>>N; squa = N*N; /*为指向int型指针的指针分配空间, 该指针指向n个int型指针*/ int **a = (int **)malloc(N* sizeof(int)); if (a == NULL) return 0; for (i = 0; i

语言总结&mdash;C/C++

参考<程序员面试宝典> 1. 基本概念 1.1 赋值语句 例1. 按位与操作,例如:a=3,b=3,a&b值等于 0011 & 0011 结果还是0011,那么值还是3: a=4,b=3,a|b:按位或操作, 0100 | 0011 结果是0111,输出的值为7:a||b, a和b进行或运算,只要两者有一个为真则结果即为1. 例2. while(x) { count++; x=x&(x-1);} 此循环用来求输入值x转化为二进制后1的个数.eg:9(1001)&

螺旋队列顺时针方向 和逆时针方向的实现

这个博主找规律的部分写得很好,原样放在下面.最后给出了顺时针和逆时针方向的螺旋队列的实现,可以看出它们的差别如此之小. 和螺旋队列类似,也是找规律的zigzag数组见这个帖子. 螺旋队列的样子如下图: 两大规律: 1.螺旋规律 2.奇数(圈数,或X轴正坐标)平方规律(紫线) 问题描述: 设1的坐标是(0,0),x方向向右为正,y方向向下为正,例如,7的坐标为(-1,-1),2的坐标为(1,0).编程实现输入任意一点坐标(x,y),输出所对应的数字! 问题解决: 从紫线突破. 从图中不难发现,每圈

Leetcode-5147 Decrease Elements To Make Array Zigzag(递减元素使数组呈锯齿状)

1 #define _for(i,a,b) for(int i = (a);i < b;i ++) 2 typedef long long ll; 3 using namespace std; 4 5 class Solution 6 { 7 public: 8 int movesToMakeZigzag(vector<int>& nums) 9 { 10 int rnt1 = 0; 11 int rnt2 = 0; 12 13 _for(i,1,nums.size()) 14

No.006:ZigZag Conversion

题目: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R Write the code that will take a string a

Leetcode 103. Binary Tree Zigzag Level Order Traversal

1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * TreeNode *left; 6 * TreeNode *right; 7 * TreeNode(int x) : val(x), left(NULL), right(NULL) {} 8 * }; 9 */ 10 class Solution { 11 public: 12 vector<vector<int>>

【LeetCode】6 - ZigZag Conversion

The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibility) P A H N A P L S I I G Y I R And then read line by line: "PAHNAPLSII

将字符串转化成ZigZag模式

背景: 原问题出处:https://leetcode.com/problems/zigzag-conversion/ 就是将一个字符串按ZigZag格式进行转换,并返回.例如字符串"ABCDEFGHIJK" 转换后(3行): A E I BDFHJ C G K 然后按行打印:AEIBDFHJCGK 如果按4行转换: A  G B FH CE IK D  J 打印:AGBFHCEIKDJ 思路: 其实这道题像是找规律题.当转换为3行时,我们可以以4为单位(4=(3-1)*2.也就是等于(