打印zigzag数组

今天花了不少时间来研究如何打印一个之字形zigzag矩阵,参考了下http://blog.163.com/yangjun1988422@126/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 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      */
//a[0][0],a[0][1],a[1][0],a[2][0],a[1][1],a[0][2],a[0][3]
//zigzag排列顺序
//具体思路:
//1.建立一个动态二维数组用来存储数据
//2.把矩阵分为上下两个半区,左上半区和右下半区
//3.左上半区按行进行遍历,分为奇偶列,偶列依次减小,奇列依次增加(依次表示的是斜的顺序)
//4.右下半区也按行进行遍历,奇从下往上依次增加,偶从下往上依次减小
#include "stdafx.h"
#include <iostream>
#include <iomanip>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int **data;
	//一个n*n的矩阵,使用动态数组
	int n;
	cout<<"请输入n*n矩阵的行列数:";
	cin>>n;
	data=new int *[n];
	for(int i=0; i<n; i++)
	{
		data[i]=new int [n];
	}
	//初始化二维矩阵
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<n; j++)
		{
			data[i][j]=0;
		}
	}
	int x,y;
	int count=0;
	//左上半区
	for(int i=0; i<n; i++)
	{
		if(i%2==0)
		{
			x=i;
			y=0;
			for(int j=0; j<i+1; j++)
			{
				data[x--][y++]=count++;
			}
		}
		if(i%2==1)
		{
			x=0;
			y=i;
			for(int j=0; j<i+1; j++)
			{
				data[x++][y--]=count++;
			}
		}
	}

	//右下半区
	for(int i=1; i<n; i++)
	{
		if(i%2==0)
		{
			x=i;
			y=n-1;
			for(int j=0; j<n-i; j++)
			{
				data[x++][y--]=count++;
			}
		}
		if(i%2==1)
		{
			x=n-1;
			y=i;
			for(int j=0; j<n-i; j++)
			{
				data[x--][y++]=count++;
			}
		}
	}

	//打印二维矩阵
	for(int i=0; i<n; i++)
	{
		for(int j=0; j<n; j++)
		{
			cout<<setw(5)<<data[i][j]<<" ";
		}
		cout<<endl;
	}
	//销毁二维矩阵
	for(int i=0; i<n; i++)
	{
		delete [] data[i];
	}
	delete [] data;
	system("pause");
	return 0;
}

结果:

相关文章
相关标签/搜索