八数码问题怎么用代码实现
时间: 2023-03-28 07:01:47 浏览: 174
八数码问题的代码
八数码问题可以用深度优先搜索、广度优先搜索、A*算法等多种算法实现。以下是一种深度优先搜索的实现方式:
1. 定义一个3x3的矩阵表示当前状态,用表示空格。
2. 定义一个目标状态,比如1 2 3 4 5 6 7 8 。
3. 定义一个栈,将初始状态压入栈中。
4. 从栈中弹出一个状态,判断是否为目标状态,如果是则输出结果,结束程序。
5. 如果不是目标状态,则扩展当前状态,即将空格上下左右四个方向的数字与空格交换位置,得到四个新状态。
6. 将新状态压入栈中,继续搜索。
7. 重复步骤4-6,直到找到目标状态或者栈为空。
代码实现可以参考以下示例:
#include <iostream>
#include <stack>
#include <set>
using namespace std;
const int N = 3;
const int target[N][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, }};
struct State {
int board[N][N];
int x, y; // 空格的位置
int depth; // 当前状态的深度
State(int b[N][N], int x, int y, int d): x(x), y(y), depth(d) {
for (int i = ; i < N; i++)
for (int j = ; j < N; j++)
board[i][j] = b[i][j];
}
bool operator < (const State& other) const {
for (int i = ; i < N; i++)
for (int j = ; j < N; j++)
if (board[i][j] != other.board[i][j])
return board[i][j] < other.board[i][j];
return false;
}
};
bool is_target(int board[N][N]) {
for (int i = ; i < N; i++)
for (int j = ; j < N; j++)
if (board[i][j] != target[i][j])
return false;
return true;
}
void print_path(stack<State>& path) {
while (!path.empty()) {
State state = path.top();
path.pop();
for (int i = ; i < N; i++) {
for (int j = ; j < N; j++)
cout << state.board[i][j] << " ";
cout << endl;
}
cout << endl;
}
}
void dfs(State start) {
stack<State> path;
set<State> visited;
path.push(start);
visited.insert(start);
while (!path.empty()) {
State state = path.top();
path.pop();
if (is_target(state.board)) {
print_path(path);
return;
}
int dx[] = {-1, , 1, };
int dy[] = {, 1, , -1};
for (int i = ; i < 4; i++) {
int nx = state.x + dx[i];
int ny = state.y + dy[i];
if (nx < || nx >= N || ny < || ny >= N)
continue;
State next = state;
swap(next.board[state.x][state.y], next.board[nx][ny]);
next.x = nx;
next.y = ny;
next.depth++;
if (visited.count(next) == ) {
path.push(next);
visited.insert(next);
}
}
}
cout << "No solution!" << endl;
}
int main() {
int board[N][N];
cout << "Please input the initial state:" << endl;
for (int i = ; i < N; i++)
for (int j = ; j < N; j++)
cin >> board[i][j];
int x, y;
for (int i = ; i < N; i++)
for (int j = ; j < N; j++)
if (board[i][j] == ) {
x = i;
y = j;
}
State start(board, x, y, );
dfs(start);
return ;
}
阅读全文