一道简单的回溯搜索题
在一个4*4的小方格(如图所示)中放置8个*号,使得每行每列放且
仅放两个*号。
┌─┬─┬─┬─┐
│*│*│ │ │
├─┼─┼─┼─┤
│*│ │*│ │
├─┼─┼─┼─┤
│ │*│ │*│
├─┼─┼─┼─┤
│ │ │*│*│
└─┴─┴─┴─┘
求出所有的基本解。
#include <iostream> using namespace std; const int N = 4; int selected[N][N]; int colCoins[N]; //记录每列当前的硬币数量 int gCount = 0; void Print() { cout << "第" << gCount << "组" << endl; for (int i = 0;i<N;i++) { for (int j = 0;j<N;j++) { cout << selected[i][j] << " "; } cout << endl; } cout << endl << endl; gCount++; } void Initialize() { for (int i = 0;i<N;i++) { for (int j = 0;j<N;j++) { selected[i][j] = 0; } colCoins[i] = 0; } } void Go(int row) { if (row == N) //得到了一个可行解,输出可行解 { Print(); return; } for (int i = 0;i<N;i++) { for (int j = i+1;j<N;j++) { if (colCoins[i] < 2 && colCoins[j] < 2) //这两个位置可以放置硬币 { colCoins[i]++;colCoins[j]++; selected[row][i] = selected[row][j] = 1; Go(row + 1); colCoins[i]--;colCoins[j]--; //回溯 selected[row][i] = selected[row][j] = 0; } } } } void main() { // Initialize(); Go(0); cout << "共有" << gCount << "组解"<<endl; }
posted on 2010-04-19 16:55 speedmancs 阅读(418) 评论(0) 编辑 收藏 举报