栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

(三)生成螺旋矩阵

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

(三)生成螺旋矩阵

【题目】给定一个正整数 n,生成一个包含 1 到 n^2 所有元素,且元素按顺时针顺序螺旋排列的正方形矩阵。

【示例】输入:3 输出:

【解题思路】依照左闭右开或左开右闭的原则,使用矩阵分圈处理
(1)左闭右开原则:(防止乱套)
模拟顺时针画矩阵的过程:

  • 填充上行从左到右
  • 填充右列从上到下
  • 填充下行从右到左
  • 填充左列从下到上

每一种颜色,代表一条边,我们遍历的长度,可以看出每一个拐角处的处理规则,拐角处让给新的一条边来继续画。

【参考自】代码随想录
(2)矩阵分圈处理
在矩阵中用左上角的坐标(tR,tC)和右下角的坐标(dR,dC)表示一个子矩阵。例如矩阵

当(tR,tC)=(0,0)、(dR,dC)=(3,3)时,表示的矩阵就是整个矩阵,那么这个矩阵的最外层部分为


填充时可以先把这个子矩阵的最外圈依次填充,接下来令tR和tC加1,即(tR,tC)=(1,1),dR和dC减1,即(dR,dC)=(2,2)此时子矩阵为

然后再把这个矩阵最外圈填充。
循环停止条件:左上角坐标跑到了右下角坐标的右方或下方,则整个过程停止。

class InsertMatrix{
public://顺时针插入数据
    vector > spiralOrderPrint(int n){
        vector > res(n,vector(n)); //用vector表示的二维数组
        int tR = 0;
        int tC = 0;
        int dR = res.size() - 1; 
        int dC = res[0].size() - 1;
        int count = 0;//要填充的数据
        while(tR <= dR && tC <= dC){
			int curR = tR;
			int curC = tC;
			while(curC != dC){ //填充上行从左到右
			    res[tR][curC++] = ++count;
			}
			while(curR != dR){ //填充右列从上到下
			    res[curR++][dC] = ++count;
			}
			while(curC != tC){ //填充下行从右到左
			    res[dR][curC--] = ++count;
			}
			while(curR != tR){ //填充左列从下到上
			    res[curR--][tC] = ++count;
			}
            tR++;tC++;dR--;dC--; //更新为下一个子矩阵
        }
        return res;
    }
};

【测试】

#include 
#include 
using namespace std;

int main(){
    cout << "顺时针插入数据:" << endl;
    InsertMatrix* q = new InsertMatrix();
    vector > res =  q->spiralOrderPrint(5);
    //此处直接打印
    cout << "打印螺旋矩阵:" << endl;
	for(int i = 0; i < res.size();i++){
		for(int j = 0;j < res[0].size();j++){
			cout << res[i][j] << " ";
		}
	}
    cout << endl;
    
    return 0;
}

【参考】程序员代码面试指南——左程云

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/656930.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号