pyhthon3 二维矩阵赋值_[ACM]C++实现螺旋矩阵(Rotate Array)算法
实现Rotate Array算法的总体思路就是把矩阵看成一个个同心圆圈,然后利用矩阵大小能否被2整除的规律得到同心圆的圈数,再依次设计出从左到右、从上到下、从右到左、从下到上四种子循环遍历,有多少圈数四种子循环就需要执行多少次。首先几个头文件:#include "stdafx.h"#include <iostream>#include <iomanip>#includ...
·
- 实现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");
- 结果:
更多推荐
已为社区贡献3条内容
所有评论(0)