• LeetCode 1368. Minimum Cost to Make at Least One Valid Path in a Grid(BFS,贪心)


    题目

    题意:从最左上角的点开始,按照格子里规定的方向走,必要时可以改变方向,cost+1。问你能够顺利走到最右下角的最小的cost是多少

    题解:我们用贪心的思路,从左上角开始,用BFS 计算每个格子到达时所花费的最小cost。这个方法有点像dijskra算法,区别就是不用去找最小的点,因为在BFS的时候,每一层就是最小的值。

    struct Node
    {
        int x;
        int y;
        int value;
        Node(){}
        Node(int x,int y,int value)
        {
            this->x = x;
            this->y = y;
            this->value = value;
        }
    };
    class Solution {
    public:
        int dir[5][2]={{0,0},{0,1},{0,-1},{1,0},{-1,0}};
        int vis[105][105];
        queue<Node> q;
        int n,m;
        int minCost(vector<vector<int>>& grid) {
            
            n = grid.size();
            m = grid[0].size();
            int x=0,y=0;
            q.push(Node(0,0,0));
            vis[0][0]=1;
            find(0,0,0,grid);
           
            int ans;
            while(!q.empty())
            {
                Node term = q.front();
                q.pop();
                if(term.x == n-1&&term.y==m-1)
                {
                    ans=term.value;
                    break;
                }
        
                for(int i=1;i<5;i++)
                {
                    int xx = term.x + dir[i][0];
                    int yy = term.y + dir[i][1];
                    
                    if(xx<0||xx>=n||yy<0||yy>=m)
                        continue;
                    if(vis[xx][yy]==0)
                    {
                        q.push(Node(xx,yy,term.value+1));
                        vis[xx][yy]=1;
                        find(xx,yy,term.value+1,grid);
                    }
                } 
            }
            return ans;
            
        }
        
        void find(int x,int y,int value,vector<vector<int>>& grid)
        {
            while(1)
            {
                int xx = x + dir[grid[x][y]][0];
                int yy = y + dir[grid[x][y]][1];
                
                if(xx<0||xx>=n||yy<0||yy>=m)
                    break;
                if(vis[xx][yy]==1)
                    break;
                vis[xx][yy]=1;
                q.push(Node(xx,yy,value));
                x=xx;
                y=yy;
            }
        }
    };
    
  • 相关阅读:
    triangle
    Synchronizing timer
    jenkins 安装网址
    Java I/O编程思路
    SpEL快速入门
    Spring ApplicationContext的事件机制
    畅谈Spring设计哲学
    Spring ApplicationContext的国际化支持
    SQL中 WHERE与HAVING的区别
    Hibernate的查询语言之HQL(二)——Hibernate查询的from字句
  • 原文地址:https://www.cnblogs.com/dacc123/p/12418879.html
Copyright © 2020-2023  润新知