天天看點

n*n階矩陣逆時針輸出

問題描述:n*n階矩陣逆時針輸出。

即:

輸入:5

輸出:

01 16 15 14 13

02 17 24 23 12

03 18 25 22 11

04 19 20 21 10

05 06 07 08 09

思路: 經分析,可以發現此題輸出格式猶如轉圈圈。當n為偶數的時候剛好轉了n/2圈;當n為奇數的時候,同樣也是轉了n/2圈,因為n/2取整。又根據轉圈特色,可以把轉圈分為向下、向右、向上、向左分别去實作。這時注意n為奇數時有個正中心點。

/*c++實作逆時針旋轉的矩陣*/
#include<iostream>
#include<iomanip>
using namespace std;
#define N 1000
int a[N][N];
void fun(int n)
{
	int m=1,i,j;
	for(i=0;i<n;i++)//初始化矩陣元素為0
	{
		for(j=0;j<n;j++)
			a[i][j] = 0;
	}
	for(i=0;i<n/2;i++)//隻旋轉n/2次
	{
		for(j=i;j<n-i;j++)//向下		                {
			if(a[j][i]==0)
				a[j][i] = m++;
		}
		for(j=i+1;j<n-i;j++)//向右
		{
			if(a[n-i-1][j]==0)
				a[n-i-1][j]= m++;
		}
		for(j=n-i-2;j>i;j--)//向上
		{
			if(a[j][n-i-1]==0)
				a[j][n-i-1]=m++;
		}
		for(j=n-i-1;j>i;j--)//向左
		{
			if(a[i][j]==0)
				a[i][j]=m++;
		}
	}
	if(n%2==1)//注意!當n為奇數時,有個正中心點
		a[n/2][n/2] = m;
	for(i=0;i<n;i++)//格式化輸出
	{
		for(j=0;j<n;j++)
		{
			cout<<setw(2)<<setfill('0')<<a[i][j]<<"\t";
		}
		cout<<endl;
	}
}
int main()
{
	int n;
	cout<<"請輸入 n 的值:";
	cin>>n; 
	fun(n);
	return 0;
} 
           

那麼如果順時針輸出的話也同樣很容易就可以解決了。

/*C++實作順時針旋轉的矩陣*/
#include<iostream>
#include<iomanip>
using namespace std;
#define N 100
int a[N][N];
void fun(int n)
{
	int m=1,i,j;
	for(i=0;i<n;i++)//初始化矩陣元素為0
	{
		for(j=0;j<n;j++)
			a[i][j] = 0;
	}
	for(i=0;i<n/2;i++)//隻旋轉n/2次
	{
		for(j=i;j<n-i;j++)//向右
		{
			if(a[i][j]==0)
				a[i][j] = m++;
		}
		for(j=i;j<n-i;j++)//向下
		{
			if(a[j][n-i-1]==0)
				a[j][n-i-1]=m++;
		}
		for(j=n-i-1;j>i;j--)//向左
		{
			if(a[n-i-1][j]==0)
				a[n-i-1][j]=m++;
		}
		for(j=n-i-1;j>i;j--)//向上
		{
			if(a[j][i]==0)
				a[j][i]= m++;
		}
	}
	if(n%2==1)//注意!當n為奇數時,有個正中心點
		a[n/2][n/2] = m;
	for(i=0;i<n;i++)//格式化輸出
	{
		for(j=0;j<n;j++)
		{
			cout<<setw(2)<<setfill('0')<<a[i][j]<<"\t";
		}
		cout<<endl;
	}
}
int main()
{
	int n;
	cout<<"請輸入 n 的值:";
	cin>>n; 
	fun(n);
	return 0;
}