N皇后
#include <bits/stdc++.h>
using namespace std;
int N;
int queenpos[100];//第几列的值
void Nqueen(int k)
{
int i;
if (k == N)
{
for (i = 0; i < N; i++)
{
cout << queenpos[i] + 1 << " ";
}
cout << endl;
return;
}
for (i = 0; i < N; i++)
{
int j;
for (j = 0; j < k; j++)
{
if (queenpos[j] == i||abs(queenpos[j]-1)==abs(k-j))
{
break;
}
}
if (j == k)
{
queenpos[k]=i;
Nqueen(k+1);
}
}
}
int main()
{
cin >> N;
Nqueen(0);
return 0;
}
这种解法很抽象,但是代码很简洁,将回溯看成一棵树,n皇后就是深度为n的树然后逐层检查合理性。
数独解法
#include <bits/stdc++.h>
using namespace std;
bool isValid(int board[9][9], int row, int col, int k)//判断
{
for (int i = 0; i < 9; i++)
{
if (board[i][col] == k)
return false;
}
for (int i = 0; i < 9; i++)
{
if (board[row][i] == k)
return false;
}
int startrow = (row / 3) * 3;
int startcol = (col / 3) * 3;
for (int i = startrow; i < startrow + 3; i++)
{
for (int j = startcol; j < startcol + 3; j++)
{
if (board[i][j] == k) return false;
}
}
return true;
}
bool backtracking(int board[9][9])
{
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
if (board[i][j] != 0) continue;//碰到已经填入的数字就跳过
for (int t = 1; t <= 9; t++)
{
if (isValid(board, i, j, t))
{
board[i][j] = t;
if (backtracking(board)) return true;
}
board[i][j] = 0;
}
return false;
}
}
return true;
}
int main()
{
int board[9][9];
for (int i = 0; i < 9; i++)//输入九宫格
{
for (int j = 0; j < 9; j++)
{
cin >> board[i][j];
}
}
backtracking(board);
for (int i = 0; i < 9; i++)
{
for (int j = 0; j < 9; j++)
{
cout << board[i][j]<<" ";
}
cout << endl;
}
}
这个算法的backtracking函数要用bool做返回值,这样才能判断是否找到正确的数字。