【算法】单词搜索、最短距离

单词搜索

这道题主要考察了深度优先遍历(DFS)算法。

我们通过几个简单例子来分析一些细节问题:

  1. 要搜索的单词串:abc

搜索的过程中必须按照字母顺序,首先从矩阵中的第一个元素开始搜索,遇到字母a则开始深度优先遍历,搜索周围满足条件的字母,这种情况是可以找到的。

2.待搜索单词串:aba

此时是无法找到的,但是这里想一想从头开始遍历矩阵遇到字母a,则开始深度优先遍历,在到字母b,此时对于字母b它的周围也是有已经遍历过的字母a的,如果不对字母a进行标记就会对字母a再进行遍历,那答案就错了,因此我们要对矩阵中满足条件并且已经被遍历过的字母进行标记。

3.待搜索单词串:srds

首先会从矩阵中第一个字母进行深度优先遍历,因此矩阵中的第一个字母s会被标记,由于字母s周围的字母没有与待搜索单词匹配的因此会接着遍历矩阵,直到遇到下一个字母s,此时就会通过深度优先遍历到矩阵中的第一个字母s处,如果此时这个字母s是被标记的状态那就会搜索失败,因此要在最开始当矩阵中第一个字母s退出深度优先遍历时,必须要将其标记取消,这是一个细节。

cpp 复制代码
class Solution {
public:
    int arr_x[4] = {-1,1,0,0};
    int arr_y[4] = {0,0,-1,1};
    bool arr_judge[6][6] = {false};
    bool exist(vector<vector<char>>& board, string word) {
        for(int i = 0;i < board.size();++i){
            for(int j = 0;j < board[0].size();++j){
                if(board[i][j] == word[0]){
                    if(dfs(board,word,i,j,0)){
                    return true;
                }
                }
            }
        }
        return false;
    }
    bool dfs(const vector<vector<char>>& board,const string& word,int i,int j,int pos)
    {
        if(pos == word.length()-1){
            return true;
        }
        arr_judge[i][j] = true;
        for(int k = 0;k < 4;++k){
            int x = i + arr_x[k];
            int y = j + arr_y[k]; //注意
            if(x >= 0 && x < board.size() && y >= 0 && y < board[0].size() && !arr_judge[x][y] && board[x][y] == word[pos+1]){
                if(dfs(board,word,x,y,pos+1)){
                    return true;
                }
            }
        }
        arr_judge[i][j] = false; //将该位置取消标记
        return false;
    }
};

最短距离

运动员男女组成一个矩形方阵,计算每个人离最近的女生的距离(相邻两个人之间的距离为1)

题目描述 输入:一个矩阵,0代表女,1代表男,

输出:一个同样大小的矩阵,每个元素是其距离最近的女生的距离

下面是一个简单的示例:

这道题可以使用广度优先遍历(BFS)来做:

cpp 复制代码
vector<vector<int>> shortestDistance(const vector<vector<int>>& vv)
{
	int rows = vv.size();
	int cols = vv[0].size();
	vector<vector<int>> res(rows, vector<int>(cols, INT_MAX));
	queue<pair<int, int>> q;
	//先将矩阵中的女生对应的最短距离设为0
	for (int i = 0;i < rows;++i)
	{
		for (int j = 0;j < cols;++j)
		{
			if (0 == vv[i][j])
			{
				res[i][j] = 0;
				q.push({ i,j });
			}
		}
	}
	int x[4] = { -1,1,0,0 };
	int y[4] = { 0,0,-1,1 };
	while (!q.empty())
	{
		pair<int, int> p = q.front();
		int X = p.first;
		int Y = p.second;
		q.pop();
		for (int i = 0;i < 4;++i)
		{
			int newX = X + x[i];
			int newY = Y + y[i];
			if (newX >= 0 && newX < cols && newY >= 0 && newX < rows && res[X][Y] + 1 < res[newX][newY])
										//res[X][Y] + 1 < res[newX][newY]这个条件很关键
			{
				res[newX][newY] = res[X][Y] + 1;
				q.push(pair<int, int>(newX, newY));
			}
		}
	}
	return res;
	//pair<int, int> p(1, 2);
	//auto& [a, b] = p; //C++17新特性结构化绑定
}
相关推荐
拾光拾趣录8 分钟前
链表合并:双指针与递归
前端·javascript·算法
好易学·数据结构14 分钟前
可视化图解算法56:岛屿数量
数据结构·算法·leetcode·力扣·回溯·牛客网
香蕉可乐荷包蛋1 小时前
AI算法之图像识别与分类
人工智能·学习·算法
chuxinweihui2 小时前
stack,queue,priority_queue的模拟实现及常用接口
算法
tomato092 小时前
河南萌新联赛2025第(一)场:河南工业大学(补题)
c++·算法
墨染点香2 小时前
LeetCode Hot100【5. 最长回文子串】
算法·leetcode·职场和发展
甄卷3 小时前
李沐动手学深度学习Pytorch-v2笔记【08线性回归+基础优化算法】2
pytorch·深度学习·算法
Ashlee_code3 小时前
美联储降息趋缓叠加能源需求下调,泰国证券交易所新一代交易系统架构方案——高合规、强韧性、本地化的跨境金融基础设施解决方案
java·算法·金融·架构·系统架构·区块链·需求分析
屁股割了还要学4 小时前
【C语言进阶】内存函数
c语言·开发语言·学习·算法·青少年编程
im_AMBER5 小时前
Leetcode 03 java
算法·leetcode·职场和发展