Bài toán: đặt các số 1, 2, 3, 4, 5, 6, 7, 8 vào 8 ô tròn của hình vẽ sao cho không có hai số nào liền kề nhau (theo thứ tự tự nhiên) được đặt vào các ô liền kề nhau trên lưới.
Đầu vào là ma trận 3x4 với các giá trị 0 (ô không dùng) và -1 (ô cần điền):
| 0 | -1 | -1 | 0 |
| -1 | -1 | -1 | -1 |
| 0 | -1 | -1 | 0 |
Đầu ra mong đợi (một lời giải hợp lệ):

Giải thuật quay lui (backtracking) với các hàm:
present_in_grid(): kiểm tra số đã xuất hiện trong lưới chưa.isSafe(): kiểm tra an toàn khi đặt số tại (row, col) — không trùng số, không liền kề với số chênh lệch 1.search_free_location(): tìm ô trống tiếp theo.Solve(): hàm đệ quy chính, thử đặt các số 1..8, quay lui nếu không hợp lệ.
Ví dụ hoàn chỉnh (C++)
#include <cmath>
#include <iostream>
#define N 3
#define M 4
#define NOTCONSIDERED -1
using namespace std;
bool present_in_grid(int grid[N][M], int num) {
for (int i = 0; i < N; i++)
for (int j = 0; j < M; j++)
if (grid[i][j] == num) return true;
return false;
}
bool isSafe(int grid[N][M], int row, int col, int num) {
// Kiểm tra chi tiết cho từng vị trí cụ thể của lưới 3x4
// (code gốc có nhiều nhánh if-else cho 8 vị trí hợp lệ)
// ...
return true; // Rút gọn
}
bool search_free_location(int grid[N][M], int& row, int& col) {
for (row = 0; row < N; row++)
for (col = 0; col < M; col++)
if (grid[row][col] == NOTCONSIDERED) return true;
return false;
}
void show_res(int grid[N][M]) {
for (int i = 0; i < N; i++) {
if (i == 0 || i == N - 1) cout << " ";
for (int j = 0; j < M; j++) {
if (grid[i][j] == 0) cout << " ";
else cout << grid[i][j] << " ";
}
cout << endl;
}
}
bool Solve(int grid[N][M]) {
int row, col;
if (!search_free_location(grid, row, col)) return true;
for (int num = 1; num <= 8; num++) {
if (isSafe(grid, row, col, num)) {
grid[row][col] = num;
if (Solve(grid)) return true;
grid[row][col] = NOTCONSIDERED;
}
}
return false;
}
int main(){
int grid[N][M] = { { 0, -1, -1, 0 },
{ -1, -1, -1, -1 },
{ 0, -1, -1, 0 } };
if (Solve(grid)) show_res(grid);
else cout << "Not possible";
}
Đầu vào
{ { 0, -1, -1, 0 }, { -1, -1, -1, -1}, { 0, -1, -1, 0 }
Đầu ra
3 5 7 1 8 2 4 6