C ++中的滑动拼图

假设我们有一块2x3的棋盘,有5个图块,这些图块由数字1到5表示,那里有一个空的正方形,由0表示。

这里的移动表示0和一个相邻的数字(上,下,左或右)并将其交换。当元素以这种方式排列时可以解决:[[1,2,3],[4,5,0]]。

我们有拼图板;我们必须找到所需最少数量的移动,才能解决电路板的状态。如果这不可能解决,则返回-1。

因此,如果输入像[[1,2,3],[0,4,5]],那么输出将为2,因为我们必须交换[0,4],然后交换[0,5]。

为了解决这个问题,我们将遵循以下步骤-

  • 定义一个功能slidingPuzzle(),它将板作为输入

  • 如果板子布置得很好,那么-

    • 返回0

  • 定义2个矩阵的一个队列q

  • 将板插入q

  • 定义一组访问二维矩阵的集合

  • 将板插入已访问

  • 对于初始化lvl:= 1,当非q为空时,更新(将lvl增加1),执行-

    • 定义一个2D数组节点= q的前元素

    • 从q删除元素

    • dx:= -1,y:= -1

    • 对于初始化i:= 0,当i <电路板大小时,进行更新(将i增加1),请执行-

    • 对于初始化k:= 0,当k <4时,更新(将k增加1),执行-

    • 如果nx <0或ny <0或nx> =板的行数或ny> =板的列数,则-

    • 交换节点[x,y]和节点[nx,ny]

    • 如果节点已被访问,则-

    • 将节点插入已访问

    • 如果节点是板的完美布置,则-

    • 将节点插入q

    • 交换节点[x,y]和节点[nx,ny]

    • 如果node [i,j]等于0,则-

    • x:=我

    • y:= j

    • 从循环中出来

    • 对于初始化j:= 0,当j <board [0]的大小时,更新(将j增加1),执行-

    • 忽略以下部分,跳至下一个迭代

    • 交换节点[x,y]和节点[nx,ny]

    • 忽略以下部分,跳至下一个迭代

    • 返回lvl

    • sz:= q的大小

    • 当sz为非零值时,请在每次迭代后减小sz,请执行以下操作-

    • 返回-1

    让我们看下面的实现以更好地理解-

    示例

    #include <bits/stdc++.h>
    using namespace std;
    int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    class Solution {
       public:
       bool ok(vector < vector <int> >& b){
          return b[0][0] == 1 && b[0][1] == 2 && b[0][2] == 3 && b[1]
          [0] == 4 && b[1][1] == 5;
       }
       int slidingPuzzle(vector<vector<int>>& board) {
          if (ok(board))
          return 0;
          queue<vector<vector<int> > > q;
          q.push(board);
          set<vector<vector<int> > > visited;
          visited.insert(board);
          for (int lvl = 1; !q.empty(); lvl++) {
             int sz = q.size();
             while (sz--) {
                vector<vector<int> > node = q.front();
                q.pop();
                int x = -1;
                int y = -1;
                for (int i = 0; i < board.size(); i++) {
                   for (int j = 0; j < board[0].size(); j++) {
                      if (node[i][j] == 0) {
                         x = i;
                         y = j;
                         break;
                      }
                   }
                }
                for (int k = 0; k < 4; k++) {
                   int nx = x + dir[k][0];
                   int ny = y + dir[k][1];
                   if (nx < 0 || ny < 0 || nx >= board.size() || ny
                   >= board[0].size())
                   continue;
                   swap(node[x][y], node[nx][ny]);
                   if (visited.count(node)) {
                      swap(node[x][y], node[nx][ny]);
                      continue;
                   }
                   visited.insert(node);
                   if (ok(node))
                   return lvl;
                   q.push(node);
                   swap(node[x][y], node[nx][ny]);
                }
             }
          }
          return -1;
       }
    };
    main(){
       Solution ob;
       vector<vector<int>> v = {{1,2,3},{0,4,5}};
       cout << (ob.slidingPuzzle(v));
    }

    输入值

    {{1,2,3},{0,4,5}}

    输出结果

    2