LeetCode:773. 滑动谜题

class Solution {

public:

int slidingPuzzle(vector<vector<int>>& board) {

string target="123450";

string start="";

for(int i=0;i<board.size();i++){

for(int j=0;j<board[0].size();j++){

start=start+to_string(board[i][j]);

}

}

//开始BFS算法

unordered_set<string>visited;

queue<string>q;

//从起点开始搜索

q.push(start);

visited.insert(start);

int step=0;

while(!q.empty()){

int sz=q.size();

for(int i=0;i<sz;i++){

string cur=q.front();

q.pop();

//判断是否达到目标

if(target==cur){

return step;

}

//将数字0和周围数字交换位置

for(string neighborBoard:getNeighbors(cur)){

//防止走回头路

if(!visited.count(neighborBoard)){

q.push(neighborBoard);

visited.insert(neighborBoard);

}

}

}

step++;

}

return -1;

}

vector<string>getNeighbors(string board){

vector<vector<int>>mapping={

{1,3},

{0,4,2},

{1,5},

{0,4},

{3,1,5},

{4,2}

};

int idx=board.find('0');

vector<string>neighbors;

for(int adj:mapping[idx]){

string new_board=swap(board,idx,adj);

neighbors.push_back(new_board);

}

return neighbors;

}

string swap(string board, int i, int j){

char tmp=board[i];

board[i]=board[j];

board[j]=tmp;

return board;

}

};

相关推荐
夏鹏今天学习了吗3 小时前
【LeetCode热题100(50/100)】岛屿数量
算法·leetcode·职场和发展
墨染点香3 小时前
LeetCode 刷题【134. 加油站】
算法·leetcode·职场和发展
千里马-horse4 小时前
Boost.Iostreams 简介
开发语言·c++·boost
yi碗汤园4 小时前
【一文了解】八大排序-冒泡排序、选择排序
开发语言·前端·算法·unity·c#·1024程序员节
二倍速播放4 小时前
贪心算法 with Gemini
算法·贪心算法
陌路204 小时前
C17值类别概念
开发语言·c++
shark_dev4 小时前
C++新特性—— 智能指针(shared_ptr/unique_ptr/weak_ptr)
c++
oliveira-time4 小时前
整数划分问题
算法
huangql5204 小时前
JavaScript数据结构实战指南:从业务场景到性能优化
javascript·数据结构·性能优化