首页 > 其他分享 >1210.minimum-moves-to-reach-target-with-rotations 穿过迷宫的最少移动次数

1210.minimum-moves-to-reach-target-with-rotations 穿过迷宫的最少移动次数

时间:2023-02-05 17:57:31浏览次数:54  
标签:tmp 1210 return target rotations else grid vec false

问题描述

1210.穿过迷宫的最少移动次数

解题思路

广度优先搜索

可以用(x, y, state)来表示贪吃蛇当前所处的位置,x为蛇尾的横坐标,y为蛇尾的纵坐标,state表示蛇当前处于水平还是竖直状态。

代码

class Solution {
  public:
    bool is_pos(vector<int> &vec_tmp, vector<vector<int>> &grid, int i) {
        if (i == 0) {
            vec_tmp[1] += 1;
            vec_tmp[3] += 1;
            if (vec_tmp[3] >= grid.size())
                return false;
            else {
                if (grid[vec_tmp[0]][vec_tmp[1]] == 0 && grid[vec_tmp[2]][vec_tmp[3]] == 0)
                    return true;
                else
                    return false;
            }

        } else if (i == 1) {
            vec_tmp[0] += 1;
            vec_tmp[2] += 1;
            if (vec_tmp[2] >= grid.size())
                return false;
            else {
                if (grid[vec_tmp[0]][vec_tmp[1]] == 0 && grid[vec_tmp[2]][vec_tmp[3]] == 0 && vec_tmp[2] < grid.size())
                    return true;
                else
                    return false;
            }

        } else if (i == 2) {
            if (vec_tmp[0] != vec_tmp[2])
                return false;
            else {
                vec_tmp[2] += 1;
                vec_tmp[3] -= 1;
                if (vec_tmp[2] >= grid.size())
                    return false;
                else {
                    if (grid[vec_tmp[2]][vec_tmp[3]] == 0 && grid[vec_tmp[0] + 1][vec_tmp[1] + 1] == 0)
                        return true;
                    else
                        return false;
                }
            }
        } else {
            if (vec_tmp[1] != vec_tmp[3])
                return false;
            else {
                vec_tmp[2] -= 1;
                vec_tmp[3] += 1;
                if (vec_tmp[3] >= grid.size())
                    return false;
                else {
                    if (grid[vec_tmp[2]][vec_tmp[3]] == 0 && grid[vec_tmp[0] + 1][vec_tmp[1] + 1] == 0)
                        return true;
                    else
                        return false;
                }
            }
        }
    }
    int bfs(vector<vector<int>> &grid) {
        int n = grid.size();
        // tuple的第二个元素表示移动次数
        queue<tuple<vector<int>, int>> q; // vec[0],vec[1]表示第一个格子的坐标,vec[2],vec[3]表示第二个格子的坐标
        // 对应四种移动方式的坐标变化
        vector<vector<int>> move{{0, 1, 0, 1}, {1, 0, 1, 0}, {0, 0, 1, -1}, {0, 0, -1, 1}};
        map<vector<int>, int> visited;
        visited[{0, 0, 0, 1}] = 1;
        q.push({{0, 0, 0, 1}, 0});
        while (!q.empty()) {
            auto [vec, cnt] = q.front();
            q.pop();
            // 到达终点
            if (vec[0] == n - 1 && vec[1] == n - 2 && vec[2] == n - 1 && vec[3] == n - 1)
                return cnt;
            for (int i = 0; i < 4; i++) {
                auto vec_tmp = vec;
                bool tmp = is_pos(vec_tmp, grid, i);
                if (tmp && visited.find(vec_tmp) == visited.end()) {
                    q.push({vec_tmp, cnt + 1});
                    visited[vec_tmp] = 1;
                }
            }
        }
        return -1;
    }
    int minimumMoves(vector<vector<int>> &grid) {
        int cnt = bfs(grid);
        return cnt;
    }
};

标签:tmp,1210,return,target,rotations,else,grid,vec,false
From: https://www.cnblogs.com/zwyyy456/p/17093705.html

相关文章

  • 塔吉特Target Domestic EDI 856 & 810业务分析
    Target公司位于明尼苏达州明尼阿波利斯美市,是美国仅次于沃尔玛的第二大零售百货集团,也是美国标准普尔500指数成分股。它最早名叫戴顿赫德森公司(于1962年成立),2000年1月正式......
  • 【CMake】target file 生成路径
    CMake针对不同类型生成器,参数有所差异,主要区别一下两类生成器:单配置生成器()多配置生成器(multi-configurationgenerators):VS、Xcode等target:cmake可构建三种targ......
  • InvocationTargetException
    报错代码java.lang.reflect.InvocationTargetExceptionatsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)atsun.reflect.NativeMethodAccesso......
  • 塔吉特Target Domestic EDI项目实施注意事项及解决方案
    塔吉特Target与供应商传输的是X12标准报文,业务类型包含850(采购订单)、860(订单变更)、864(文本消息)、856(发货通知)和810(发票),供应商使用知行EDI系统自动化传输、翻译,实现X12报文......
  • k8s中port、nodePort、targetPort概念的区分
    port是service端口,即k8s中服务之间的访问端口targetport是pod(也就是容器)的端口nodeport是容器所在node节点的端口,即外部机器可访问的端口。(通过nodeport类型的service......
  • Target 塔吉特的4种商品编码
    Target塔吉特共有4种商品编码:TCIN、DPCI、UPC、SKU,其中DPCI、UPC和TCIN在Target系统中是唯一的ID。在target.com中查看商品时,在任一个商品中下拉进入到商品详情页(Item/Deta......
  • Target 塔吉特DVS EDI 业务测试指南
    Target塔吉特是美国仅次于Walmart沃尔玛的第二大巨型折扣零售百货集团,由于拓展了其数字化履约能力,使得越来越多的国内零售产品供应商和Target建立合作关系。Target要求其供......
  • Target 塔吉特DVS EDI 业务测试指南
    Target塔吉特是美国仅次于Walmart沃尔玛的第二大巨型折扣零售百货集团,由于拓展了其数字化履约能力,使得越来越多的国内零售产品供应商和Target建立合作关系。Target要求其供......
  • LLVM目标无关代码生成器Target-Independent Code Generator
    LLVM目标无关代码生成器Target-IndependentCodeGenerator介绍LLVM目标无关代码生成器是一个框架,提供了一套可重用组件,用于将LLVM内部表示转换为指定目标的机器代码,无论......
  • 使用Addressables.LoadAssetAsync<Asset>(target)加载unity资源,不止是gameobject
    要声明的方法:publicstaticasyncTask<string>ReadJsonData(stringtarget){  TextAssetjsonDataObject=awaitAddressables.LoadAssetAsync<TextAsset>(target).......