1. 程式人生 > >c和c++的一些訓練題(10)(列印螺旋方陣)

c和c++的一些訓練題(10)(列印螺旋方陣)

問題的提出:編寫螺旋方陣。其中螺旋方陣形式如下:

       1  12 11  10

       2  13 16   9

       3  14 15   8

       4   5   6    7

設row,column分別代表行、列座標,變數p從1到n2將p依次存入陣列a[row][column]中,要確定row、colomn的變化情況。分析:建立一個二維動態陣列,建立方法見前一篇文章,然後觀察方陣的第一列跟第二列之間的關係,第n行和第n-1行之間的關係,第n列和第n-1列之間的關係,第一行跟第二行之間的關係,根據他們之間的關係,列出表示式就能得到最終結果。大家如果有好的想法可以共同探討,我參考了下別人的想法,但大部分思路還是自己原創的。

程式碼:

// test4.cpp : 定義控制檯應用程式的入口點。
//這是列印的最終目標
//1  12 11 10
//2  13 16 9
//3  14 15 8
//4  5  6  7

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

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	int n;
	cout<<"請輸入方陣的維數:";
	cin>>n;
	cout<<"列印二維陣列:"<<endl;
	//宣告動態二維陣列
	int **data;
	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 m=1;
	int i,j;
	int round=1;

	for(i=0; i<= n/2; i++)
	{
		//左列
		for(j=0; j<(n-2*(round-1)); j++)//0~4 0~2
		{
			data[j+round-1][round-1]=m++;
		}
		//下行
		for(j=0; j<(n-2*(round-1)-1); j++)  //0~3
		{
			data[n-round][j+round]=m++;
		}
		//右列
		for(j=0; j<(n-2*(round-1)-1); j++)
		{
			data[n-j-round-1][n-round]=m++;
		}
		//上行
		for(j=0; j<(n-2*round); j++)
		{
			data[round-1][n-j-round-1]=m++;
		}
		round++;
	}

	//列印二維陣列
	for(i=0; i<n; i++)
	{
		for(int j=0; j<n; j++)
		{
			cout<<left<<setw(3)<<data[i][j]<<" ";
		}
		cout<<endl;
	}
	//銷燬二維陣列
	for(i=0; i<n; i++)
	{
		delete[] data[i];
	}
	delete[] data;
	system("pause");
	return 0;
}
結果: