AcWing 845. 八数码

2021-02-19 02:20

阅读:615

标签:手动   iostream   表示   namespace   看到了   turn   时间   cpp   八数码   

AcWing 845. 八数码


解题思路

这道题,放在了BFS的分类下面

第一反应是从一个状态开始广搜

不过状态的表示,存储和转移,以及最短距离dist[]数组,都没有很好的想法

最终思路

看完y总的课,看到了他用一个字符串来表示一个3x3的矩阵,还真是个好想法

状态表示就用一个字符串

用一个queue q;作为BFS用的队列,然后用一个unordered_map d;作为距离数组

这里用unordered_map是因为它出色的时间复杂度,既然这里不需要用迭代器从头到尾走一遍,只需要读d[t],那最好的选择还是基于Hash,\(O(1)\)复杂度的unordered_map了

(其实可以手动hash字符串,可惜我太懒x,STL大法好)

最终源码

#include 
#include 
#include 
#include 
#include 

using namespace std;

int bfs(string state){
    queue q;
    unordered_map d;
    
    q.push(state);
    d[state] = 0;
    
    int dx[4] = {1, 0, -1, 0}, dy[4] = {0, 1, 0, -1};
    
    string ed = "12345678x";
    
    while(q.size()){
        auto t = q.front();
        q.pop();
        
        if(t == ed) return d[t];
        
        int dist = d[t];
        int k = t.find(‘x‘);
        int x = k / 3, y = k % 3;
        for(int i = 0; i = 0 && a = 0 && b > c;
        state += c;
    }
    
    cout 

AcWing 845. 八数码

标签:手动   iostream   表示   namespace   看到了   turn   时间   cpp   八数码   

原文地址:https://www.cnblogs.com/code-addicted/p/14406549.html


评论


亲,登录后才可以留言!