剑指Offer12&13——深度优先遍历

题目:剑指Offer12.矩阵中的路径:
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。
路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。
如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-jing-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

class Solution {

private:
	//function:深度优先遍历
	bool dfs( vector<vector<char>>& board, string word, short i, short j, short k){
		if(k == word.length()) return true;			//必须放在前面,避免数组中只有一个元素时出错
		else if(i<0 || i > board.size()-1 || j<0 || j>board[0].size()-1) return false;
		else if(board[i][j] == word[k]){	
				char temp = board[i][j];
				board[i][j] = '%';
				bool res = dfs(board, word, i-1, j, k+1) || dfs(board, word, i+1, j, k+1) ||dfs(board, word, i, j-1, k+1) ||dfs(board, word, i, j+1, k+1);
				board[i][j] = temp;
				return res;
		}
		else return false;
	}


public:
    bool exist(vector<vector<char>>& board, string word) {
		if(word.length() == 0) return false;
		for(short i=0; i<board.size(); ++i)
			for(short j=0; j<board[0].size(); ++j)
				if(board[i][j] == word[0])
					if(dfs(board, word, i, j, 0) == true) return true;
		return false;
    }

};

题目:剑指Offer13.机器人的运动范围,地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。
一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),
也不能进入行坐标和列坐标的数位之和大于k的格子。
例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。
但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
时间:2020/10/29

class Solution {
private:
	int  countDfs(int m, int n, int i, int j, int k, vector<vector<bool>>& flag){
		if(i<0 || i>=m || j<0 || j>=n ) return 0;
		if( i%10 + (i%100)/10 + i/100 + j%10 + (j%100)/10 + j/100 < k && flag[i][j] == true){
			flag[i][j] = false;
			return countDfs(m, n, i-1, j, k, flag) + countDfs(m, n, i+1, j, k, flag)
				+ countDfs(m, n, i, j-1, k, flag) + countDfs(m, n, i, j+1, k, flag) + 1;

		}
	}
public:
    int movingCount(int m, int n, int k) {
		if(n<0 || n>100 || m<0 || m>100 || k<0 || k>20) return -1;
		vector<vector<bool>> flag(m, vector<bool>(n, true));
		return countDfs(m, n, 0, 0, k, flag);
    }

};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值