• 实现Rotate Array算法的总体思路就是把矩阵看成一个个同心圆圈,然后利用矩阵大小能否被2整除的规律得到同心圆的圈数,再依次设计出从左到右从上到下从右到左从下到上四种子循环遍历,有多少圈数四种子循环就需要执行多少次
  • 首先几个头文件:
#include "stdafx.h"
#include <iostream>
#include <iomanip>
#include <string>
using namespace std;
  • 然后开始在int main()里操作,定一个矩阵大小变量N,并且约束一下它:
int N;
cout << "请输入矩阵大小(1-30):" << endl;
cin >> N;
	
if (N == 1)
{
	cout << 1 << endl;
	system("pause");
	return 0;
}
if (N > 30)
{
	cout << "矩阵太大,不方便排版" << endl;
	system("pause");
	return 0;
}
  • 接下来,动态申请个二维数组,VS不能像DEVC++那样直接给数组下标变量:
//数组Array[N][N];
//开辟行
int **Array = new int*[N];
//开辟列
for (int i = 0; i < N; ++i)
{
	Array[i] = new int[N];
}
  • 来一个循环赋值:
for (int i = 0; i < N; i++)
{
	for (int j = 0; j < N; j++)
	{
		Array[i][j]=0;
	}
}
  • 分析一下给定大小后的矩阵特征:
cout << "分析:" << endl;
string str = "";
int QuanShu = 0;
if (N%2!=0){
	QuanShu = (N / 2) + 1;
}else{
	QuanShu = N / 2;
}
str = to_string(N) + "*" + to_string(N) + "矩阵,一共" + to_string(QuanShu) + "圈,四个方向的算法都分别执行"+ to_string(QuanShu) +"次即可.";
cout << str << endl;
  • 根据得到的矩阵圈数制定循环次数
int Count = 1;
int x = 0;
int y = 0;
for(int i=1;i<=QuanShu;i++)
{
	//依次写上从左到右、从上到下、从右到左、从下到上四种子循环遍历
}
  • 在制定好的循环内,依次写上从左到右从上到下从右到左从下到上四种子循环遍历,这样数才是顺时针旋转的:
//左到右
for (x;; x++)
{
	//值为0则视为没有遍历的格子,直接赋值
	if (Array[y][x] == 0)
	{
		Array[y][x] = Count++;
	}
	//先判断最外圈
	if (x == N - 1) {
		y++;
		break;
	}
	//再判断内圈
	else if (Array[y][x + 1] != 0) {
		y++;
		break;
	}
}
//上到下
for (y;; y++)
{
	//值为0则视为没有遍历的格子,直接赋值
	if (Array[y][x] == 0)
	{
		Array[y][x] = Count++;
	}
	//先判断最外圈
	if (y == N - 1) {
		x--;
		break;
	}
	//再判断内圈
	else if (Array[y + 1][x] != 0) {
		x--;
		break;
	}
}
//右到左
for (x;; x--)
{
	//值为0则视为没有遍历的格子,直接赋值
	if (Array[y][x] == 0)
	{
		Array[y][x] = Count++;
	}
	//先判断最外圈
	if (x == 0) {
		y--;
		break;
	}
	//再判断内圈
	else if (Array[y][x - 1] != 0) {
		y--;
		break;
	}
}
//下到上
for (y;; y--)
{
	//值为0则视为没有遍历的格子,直接赋值
	if (Array[y][x] == 0)
	{
		Array[y][x] = Count++;
	}
	//先判断最外圈
	if (y == 0) {
		x++;
		break;
	}
//再判断内圈
	else if (Array[y - 1][x] != 0) {
		x++;
		break;
	}
}
  • 可以看出,四种子循环遍历用的是一种思维:
  • 先看当前坐标取的矩阵值是不是0,是0就毫不犹豫赋值覆盖
  • 再判断当前坐标有没有越界(只有在最外圈的时候才有可能越界),如果到边界了就果断改变前进方向
  • 再判断当前坐标的走向的下一个矩阵值是不是0,是0就毫不犹豫赋值覆盖,如果不是0就果断改变前进方向
  • 最后来一个循环打印:
for (int i = 0; i < N; i++)
{
	//
	for (int j = 0; j < N; j++)
	{
		cout << setw(3) << Array[i][j] << " ";
	}
	//
	cout << endl;
}
  • setw(3)是三位数对齐,就是比如5可以与100上下对齐这种,然后再把cmd逮住:
system("pause");
  • 结果:

56f18e0d1cf61eb7423df8675b00b2ce.gif
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐