今天花了不少時間來研究如何打印一個之字形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;
}
結果: