使用回溯算法计算九宫格问题的所有可行解,九宫格问题是指在 3×3 的网格中填入 1-9 个不重复的数字,同时满足以下条件:九宫格问题是指在 3×3 的网格中填入 1-9 个不重复的数字,并满足每行、每列或每条对角线上的所有元素之和都是 15。请注意,每个数字只能出现一次。
回溯法,直白点说其实就是一个尝试一切可能的递归算法,也就是一种深度优先搜索算法,它的编写也满足递归的两个要点:结束条件和循环体。
#include <bits/stdc++.h>
using namespace std;
int g[9], vis[10]; //g[i]表示所有
bool judge() {
if (g[0] + g[1] + g[2] == 15 &&
g[3] + g[4] + g[5] == 15 &&
g[6] + g[7] + g[8] == 15 &&
g[0] + g[3] + g[6] == 15 &&
g[1] + g[4] + g[7] == 15 &&
g[2] + g[5] + g[8] == 15 &&
g[0] + g[4] + g[8] == 15 &&
g[2] + g[4] + g[6] == 15)
return true;
return false;
}
void output() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++)
cout << g[i*3+j];
cout << endl;
}
cout << "---------" << endl;
}
void dfs(int m) {
if (m == 9)
if (judge()) {
output();
return;
}
else
return;
for (int i = 1; i <= 9; i++) {
if (vis[i])
continue;
vis[i] = 1;
g[m] = i;
dfs(m + 1);
vis[i] = 0;
}
}
int main() {
memset(vis, 0, sizeof vis);
dfs(0);
return 0;
}