C++实现深度优先算法实现九宫重排
时间: 2023-10-20 19:14:26 浏览: 148
A*算法求解重排九宫问题
4星 · 用户满意度95%
九宫重排问题可以使用深度优先搜索算法来解决。下面是使用C++实现的深度优先算法:
```c++
#include <iostream>
#include <vector>
using namespace std;
const int N = 3;
const int M = N * N;
const int dx[] = {0, 1, 0, -1};
const int dy[] = {1, 0, -1, 0};
vector<int> path;
bool dfs(int x, int y, int depth, int prev, int target, int grid[N][N]) {
if (depth == target) return true;
for (int d = 0; d < 4; ++d) {
int nx = x + dx[d], ny = y + dy[d];
if (nx < 0 || nx >= N || ny < 0 || ny >= N) continue;
if (nx * N + ny == prev) continue;
swap(grid[x][y], grid[nx][ny]);
path.push_back(nx * N + ny);
if (dfs(nx, ny, depth + 1, x * N + y, target, grid)) return true;
path.pop_back();
swap(grid[x][y], grid[nx][ny]);
}
return false;
}
int main() {
int grid[N][N];
int x, y;
for (int i = 0; i < M; ++i) {
cin >> grid[i/N][i%N];
if (grid[i/N][i%N] == 0) x = i / N, y = i % N;
}
int target = 0;
for (int i = 0; i < M; ++i) {
if (grid[i/N][i%N] != 0) {
for (int j = 0; j < i; ++j) {
if (grid[j/N][j%N] > grid[i/N][i%N])
target++;
}
}
}
if ((x + y + target) % 2 != 0) {
cout << "No solution" << endl;
return 0;
}
path.push_back(x * N + y);
dfs(x, y, 0, x * N + y, target, grid);
for (int i = 0; i < path.size(); ++i) {
cout << path[i] << " ";
}
cout << endl;
return 0;
}
```
在这个实现中,我们使用一个二维数组来表示九宫格的状态,其中0表示空格。我们用x和y表示空格的位置。我们还用一个一维数组path来保存深度优先搜索的路径。
在dfs函数中,我们首先判断深度是否达到了目标,如果达到了目标,说明我们已经找到了解,返回true。否则,我们遍历当前位置周围的四个方向,如果可以移动,我们就尝试移动,并将移动后的位置加入到path中。然后递归地调用dfs函数,如果返回true,说明已经找到了解,直接返回true。如果返回false,说明当前方向不能到达目标状态,我们撤回之前的操作,继续尝试其他方向。
在主函数中,我们首先读入九宫格的状态,并计算出初始状态到目标状态的逆序对数。如果逆序对数加上空格的横纵坐标之和是奇数,那么无解,否则调用dfs函数进行搜索。搜索完成后,我们输出path数组中记录的路径即可。
阅读全文