zigzag数组

#include"stdafx.h"
#include<iostream>

using namespace std;

int main(){
	int n;
	cin>>n;
	int s,i,j;
	int squa;
	int ** a = (int**)malloc(sizeof(int*)*n);
	if(a == NULL){
		return 0;
	}

	for(i = 0; i < n; i++){
		a[i] = (int*)malloc(sizeof(int)*n);
		if(a[i] == NULL){
			i--;
			while(i >= 0){
				free(a[i]);
			}
			free(a);
			return 0;
		}
	}

	squa = n * n;
	for(i = 0; i < n; i++){
		for(j = 0; j < n; j++){
			s = i + j;
			if(s < n){
				a[i][j] = s*(s+1)/2 + ((s % 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(i = 0; i < n; i++){
		for(j = 0; j < n; j++){
			cout<<a[i][j]<<" ";
		}
		cout<<endl;
	}
}




由于对同一斜线上的元素,s=i+j为常数

1.对于第n个(n<N)斜线:

每一斜线个数比上一行多一个,则每一斜线的第一个值表示了在该斜线之前元素的个数,即一个累加 :

(s+1)*s/2

斜线中的任意元素可表示为s*(s+1)/2+i

2.同理对于第n个(n>=N)的斜线:

每斜线的元素个数开始减少,等差数组不适用,为方便起见,可以用减法计算元素个数,

剩余元素的斜线数目:s1=(2(N-1)-(i+j))

元素值=(N*N-(s1+1)*s1/2)-(N-i)=下一斜线的第一个元素值-该斜线剩余元素的个数

你可能感兴趣的:(zigzag数组)