蓝桥集训之八数码
-
核心思想:unordered_map + bfs
- 在原来八数码基础上加一个哈希表存路径
-
#include<iostream> #include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<queue> #include <unordered_map> #include<vector> using namespace std; typedef pair<int,int> PII; queue<string> q; unordered_map<string, int> d; unordered_map<string,string> list; //存每一张图的路径 string s; char c[2]; int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1}; string li[4] = {"u", "r", "d", "l"}; void bfs(string start) { string end = "12345678x"; d[start] = 0; list[start] = ""; q.push(start); while(q.size()) { auto t = q.front(); q.pop(); if(t == end) { cout<<list[t]; return; } int k = t.find('x'); int x = k/3,y = k%3; string lis = list[t]; for(int i=0;i<4;i++) { int a = x+dx[i] , b = y+dy[i]; if(a>=0&&a<3&&b>=0&&b<3) { swap(t[k],t[a*3+b]); if(!d.count(t)) { d[t] = 0;; list[t] = lis + li[i]; //找的新路 加进去 q.push(t); } swap(t[k],t[a*3+b]); } } } cout<<"unsolvable"<<endl; return; } int main() { for(int i=0;i<9;i++) { cin>>c; s += c; } bfs(s); }