773. 滑动谜题

 1 class Solution 
 2 {
 3 public:
 4     int slidingPuzzle(vectorint>>& board) 
 5     {
 6         int m = 2, n = 3;
 7         string start = "";
 8         string target = "123450";
 9 
10         // 将 2x3 的数组转化成字符串
11         for (int i = 0; i < m; i++) 
12         {
13             for (int j = 0; j < n; j++) 
14             {
15                 start.push_back(board[i][j] + '0');
16             }
17         }
18 
19         // 记录一维字符串的相邻索引
20         // 只要可以解开谜板,nerghbor都是一样的
21         vectorint>> neighbor = 
22         {
23             { 1, 3 },
24             { 0, 2, 4 },
25             { 1, 5 },
26             { 0, 4 },
27             { 1, 3, 5 },
28             { 2, 4 }
29         };
30 
31         /******* BFS 算法框架开始 *******/
32         queue<string> q;
33         unordered_set<string> visited;
34         q.push(start);
35         visited.insert(start);
36 
37         int step = 0;
38         while (!q.empty()) 
39         {
40             int sz = q.size();
41             for (int i = 0; i < sz; i++) 
42             {
43                 string cur = q.front(); q.pop();
44                 // 判断是否达到目标局面
45                 if (target == cur) 
46                 {
47                     return step;
48                 }
49 
50                 // 找到数字 0 的索引
51                 int idx = 0;
52                 for (; cur[idx] != '0'; idx++);
53 
54                 // 将数字 0 和相邻的数字交换位置
55                 for (int adj : neighbor[idx]) 
56                 {
57                     string new_board = cur;
58                     swap(new_board[adj], new_board[idx]);
59                     // 防止走回头路
60                     if (!visited.count(new_board)) 
61                     {
62                         q.push(new_board);
63                         visited.insert(new_board);
64                     }
65                 }
66             }
67             step++;
68         }
69         return -1;
70         /******* BFS 算法框架结束 *******/
71     }
72 };

 

你可能感兴趣的:(773. 滑动谜题)