图论(3)

127WordLadder

基本思路bfs搜索最短路径,因为是寻找最短路径,所以bfs搜索到的路径就是最短的
下面是bfs的基本思路
用set存储所有word
用map存储所有遍历过的word
用queue存储路径
从beginword开始,使用对从前到后的每一个字符进行从a到z的替换
然后检测是否在set之中,如果在,就入que入map,该word的路径就是beginword+1
递归进行搜索,最后得到答案

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> mapSet(wordList.begin(),wordList.end());
        if(mapSet.find(endWord)==mapSet.end())
        {
            return 0;
        }
        queue<string> que;
        que.push(beginWord);
        unordered_map<string,int> visitedMap;
        visitedMap.emplace(beginWord,1);
        while(!que.empty())
        {
            string curstr=que.front();que.pop();
            int path=visitedMap[curstr];
            for(int i=0;i<curstr.length();i++)
            {
                string newstr=curstr;
                for(int j=0;j<26;j++)
                {
                    newstr[i]=j+'a';
                    if(newstr==endWord)
                    {
                        return path+1;
                    }
                    if(mapSet.find(newstr)!=mapSet.end()&&
                        visitedMap.find(newstr)==visitedMap.end())
                        {
                            visitedMap[newstr]=path+1;
                            que.push(newstr);
                        }
                }
            }
        }
        return 0;
    }
};

841钥匙和房间

解题思路:广度优先搜索的应用
用一个que去记录搜索路径
用一个set去记录访问过的房间
从0号房间开始遍历钥匙,如果没访问过就加入que和set

class Solution {
public:
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        queue<int> que;
        unordered_set<int> visitedRooms;
        visitedRooms.emplace(0);
        for(int i=0;i<rooms[0].size();i++)
        {
            que.push(rooms[0][i]);
            visitedRooms.emplace(rooms[0][i]);
        }
        while(!que.empty())
        {
            int keyToNextRoom=que.front();que.pop();
            for(int i=0;i<rooms[keyToNextRoom].size();i++)
            {
                int key=rooms[keyToNextRoom][i];
                if(visitedRooms.find(key)==visitedRooms.end())
                {
                    que.push(key);
                    visitedRooms.emplace(key);
                }
            }
        }
        for(int i=0;i<rooms.size();i++)
        {
            if(visitedRooms.find(i)==visitedRooms.end())
            {
                return false;
            }
        }
        return true;

    }
};

463岛屿的周长

class Solution {
public:
    int islandPerimeter(vector<vector<int>>& grid) {
        int ans=0;
        for(int i=0;i<grid.size();i++)
        {
            for(int j=0;j<grid[0].size();j++)
            {
                if(grid[i][j]==1)
                {
                    if((i-1>=0&&grid[i-1][j]==0)||i-1<0)
                    {
                        ans++;
                    }
                    if((i+1<grid.size()&&grid[i+1][j]==0)||i+1>=grid.size())
                    {
                        ans++;
                    }
                    if((j-1>=0&&grid[i][j-1]==0)||j-1<0)
                    {
                        ans++;
                    }
                    if((j+1<grid[0].size()&&grid[i][j+1]==0)||j+1>=grid[0].size())
                    {
                        ans++;
                    }
                }
            }
        }
        return ans;

    }
};
posted @ 2024-01-14 03:15  LiviaYu  阅读(9)  评论(0)    收藏  举报