首页 > 其他分享 >LeetCode -- 773. 滑动谜题

LeetCode -- 773. 滑动谜题

时间:2023-07-21 11:35:10浏览次数:30  
标签:cur 773 -- nstr int mp str LeetCode string

 启发式搜索

 

class Solution {

struct Node {
    string str;
    int x, y;
    int val;
};

int n = 2, m = 3;
string e = "123450";

int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};

int f(string str) {
    int res = 0;
    for(int i = 0; i < n; i ++ ) {
        for(int j = 0; j < m; j ++ ) {
            if(str[i * m + j] == '0' || e[i * m + j] == '0') continue;
            int cur = str[i * m + j], next = e[i * m + j];
            int dx = abs((cur - 1) / 3 - (next - 1) / 3);
            int dy = abs((cur - 1) % 3 - (next - 1) % 3);
            res += dx + dy;
        }
    }
    return res;
}

string update(string cur, int i, int j, int p, int q) {
    swap(cur[i * m + j], cur[p * m + q]);
    return cur;
}

public:
    int slidingPuzzle(vector<vector<int>>& board) {
        string s = "";
        int x = 0, y = 0;
        for(int i = 0; i < n; i ++ ) {
            for(int j = 0; j < m; j ++ ) {
                if(board[i][j] == 0) x = i, y = j;
                s += board[i][j] + '0';
            }
        }


        auto cmp = [&](Node& left, Node& right) {
            return left.val > right.val;
        };

        priority_queue<Node, vector<Node>, decltype(cmp)> q(cmp);
        unordered_map<string, int> mp;
        q.push({s, x, y, 0});
        mp[s] = 0;

        while(q.size()) {
            auto t = q.top();
            q.pop();
            if(t.str == e) return mp[t.str];

            for(int i = 0; i < 4; i ++ ) {
                int nx = t.x + dx[i], ny = t.y + dy[i];
                if(nx < 0 || nx >= n || ny < 0 || ny >= m) continue;
                string nstr = update(t.str, t.x, t.y, nx, ny);
                if(!mp.count(nstr) || mp[nstr] > mp[t.str] + 1) {
                    q.push({nstr, nx, ny, mp[t.str] + 1 + f(nstr)});
                    mp[nstr] = mp[t.str] + 1;
                }
            }
        }

        return -1;
    }
};

 

标签:cur,773,--,nstr,int,mp,str,LeetCode,string
From: https://www.cnblogs.com/zk6696/p/17570840.html

相关文章

  • 麒麟系统设置开机启项
    1、首先我们点击开始菜单,找到设置按钮,点击进入系统设置页面。2、点击系统3、点击“开机启动”-》点击“添加自启动程序”4、点击“预览”选择程序-》“确定”即可 ......
  • 频谱仪基础(三)--- RF前端处理
     在频谱仪基础(二)讲述了高低中频的选择,对于9kHz到7GHz信号前端处理,我们需要分段进行处理,9kHz到3GHz信号采用高中频的方式,3GHz到7GHz采用低中频的方式直接将信号频谱搬移到低中频。1.9kHz到3GHz信号前端处理在图1所示中,第一个IF设置为3476.4MHz。将输入频率范围从9kHz到3GHz的输......
  • 字符串练习
    P4081[USACO17DEC]StandingOutfromtheHerdP只有一个串怎么做?那就是P2408不同子串个数。跑一遍后缀排序,按排序结果遍历后缀,考虑每个后缀会产生多少新串。为保证每个不同的串只被记录一次,只考虑去掉它与上一个串的重复部分,即为\(height_i\)。多个串类似,在串中加上......
  • 记录一下tomcat启动闪退的原因
    启动之后运行到上面,直接闪退出现原因idea启动了另一个tomcat,占用了8005端口号,因此报错,端口被占用解决方案将idea开启的项目关闭,重新启动tomcat,运行正常......
  • vim vscode
    /// **************************************操作gUU:行大写guu行小写gUaw(gUiw)单词大写guaw(guiw)单词小写************************************插入i:光标前插入I:行首插入o:下行插入O:上行插入a:光标后插入A:行尾插入^/$:跳到行首/行尾*********************......
  • Unity UGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用
    UnityUGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用1.什么是VerticalLayoutGroup组件?VerticalLayoutGroup是UnityUGUI中的一种布局组件,用于在垂直方向上自动排列子对象。它可以根据子对象的大小和布局设置,自动调整子对象的位置和大小,实现垂直布局效果。2.VerticalLay......
  • Linux删除log日志文件命令
    如下:1、删除文件夹及子目录下的日志文件find.-name'*.log*'|xargsrm2、忽略当前文件夹下的文件夹,可在-v后面添加  “/文件夹名称”,这里用log文件夹举例find.-name'*.log*'|grep-v/log|xargsrm这样就可以删除总文件夹下除了log文件夹以外的.log文件了......
  • Unity UGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用
    UnityUGUI的VerticalLayoutGroup(垂直布局)组件的介绍及使用1.什么是VerticalLayoutGroup组件?VerticalLayoutGroup是UnityUGUI中的一种布局组件,用于在垂直方向上自动排列子对象。它可以根据子对象的大小和布局设置,自动调整子对象的位置和大小,实现垂直布局效果。2.VerticalLayo......
  • 多语言高并发接入阿里巴巴电商平台,获取实时商品详情数据源码,API接口技术开发分享
    接口数据展示alibaba.item_get-获得商品详情公共参数请求地址:注册key和secret接入请私信名称类型必须描述keyString是调用key(必须以GET方式拼接在URL中)secretString是调用密钥api_nameString是API接口名称(包括在请求地址中)[item_search,item_get,item_search_shop等]cacheString......
  • python添加让输入框清空的按钮
    如何在Python中添加让输入框清空的按钮概述在Python中,可以通过使用Tkinter库来创建GUI应用程序。本文将指导你如何在Python中添加一个按钮,用于清空一个输入框中的内容。我们将使用Tkinter库中的Entry和Button组件,以及相应的事件处理函数来实现这个功能。步骤下面是实现该功能的......