【剑指offer29】【C++】顺时针打印矩阵【dfs深搜类似迷宫、一维二维vector数组初始化开辟空间的方法】

38 篇文章 0 订阅

【剑指offer29】【C++】顺时针打印矩阵【dfs深搜类似迷宫、一维二维vector初始化开辟空间的方法】

关注公众号:【THU小鱼干杂货铺】
不间断分享LeetCode优质解题思路、大厂算法题解、学习资料等
在这里插入图片描述

题目

输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。

示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[1,2,3,6,9,8,7,4,5]

示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]
输出:[1,2,3,4,8,12,11,10,9,5,6,7]

限制:

0 <= matrix.length <= 100
0 <= matrix[i].length <= 100

题解

笔记:

1. 默认值初始化,list中将包含7个元素,每个元素进行缺省的值初始化,对于int,也就是被赋值为0,因此list被初始化为包含70。
当程序运行初期元素大致数量可预知,而元素的值需要动态获取的时候,可采用这种初始化方式。
	vector<int> list(7);
2.指定值初始化,ilist5被初始化为包含7个值为3int数组;
	vector<int> ilist5(7,3);
3.二维数组初始化visited[rows][columns]的实例:
    vector<vector<bool>> visited(rows, vector<bool>(columns));
思路:
进行dfs深搜
dfs()参数讲解:
	1.dir表示当前的方向;
	2.step是终止条件,从0开始,当走到m*n长度结束,即一共有返回的数组ans已经装满了m*n个元素(matrix矩阵有m行n列);
	3.i,j是矩阵元素坐标;
	4.m,n是矩阵的行列
	5.matrix,题目要求的矩阵
	6.visited,标记是否已经访问过的数组
	7.ans,结果数组
然后进行右——下——左——上搜索的思路,
比如刚开始先向右进行搜索装载ans,当下标越界或者下一步向右的坐标已经访问过,那么更换方向向下搜索

代码:

class Solution {
public:
    vector<int> spiralOrder(vector<vector<int>>& matrix) {
        vector<int> ans;
        if(matrix.empty()||matrix[0].empty()) return ans;
        int m = matrix.size();
        int n = matrix[0].size();
        //二维数组初始化m*n,另一种方式
        vector<vector<bool>> visited(m, vector<bool>());//初始层数,赋值
        for (int i = 0; i < m; i++) {
            visited[i].resize(n);
        }
        dfs("right",0,0,0,m,n,matrix,visited,ans);
        return ans;
    }
    void dfs(string dir,int step,int i,int j,int m,int n,vector<vector<int>>& matrix,vector<vector<bool>>& visited,vector<int>& ans){
        if(step==m*n) return;
        if(i>=0&&j>=0&&i<m&&j<n&&!visited[i][j]){
            visited[i][j] = true;
            ans.push_back(matrix[i][j]);
            if(dir=="right"){
                if(j+1<n&&!visited[i][j+1]) dfs("right",step+1,i,j+1,m,n,matrix,visited,ans);
                else dfs("down",step+1,i+1,j,m,n,matrix,visited,ans);
            }
            else if(dir=="down"){
                if(i+1<m&&!visited[i+1][j]) dfs("down",step+1,i+1,j,m,n,matrix,visited,ans);
                else dfs("left",step+1,i,j-1,m,n,matrix,visited,ans);
            }
            else if(dir=="left"){
                if(j>0&&!visited[i][j-1]) dfs("left",step+1,i,j-1,m,n,matrix,visited,ans);
                else dfs("up",step+1,i-1,j,m,n,matrix,visited,ans);
            }
            else if(dir=="up"){
                if(i>0&&!visited[i-1][j]) dfs("up",step+1,i-1,j,m,n,matrix,visited,ans);
                else dfs("right",step+1,i,j+1,m,n,matrix,visited,ans);
            }
            // visited[i][j] = false;
        }
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值