八皇后问题
2013-06-30 06:40
344 查看
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
#ifndef _ALGORITHM_H__ #define _ALGORITHM_H__ namespace Algorithm { class Queen // N皇后问题 { private: int RowNumber; // 行数 int Count; // 多少种解决方案 int *Array; // 保存方案的结果 public: Queen(int rowNumber); void FindNext(int nextRow); // 回溯 bool place(int row, int column); // 是否可放置 int GetCount(); // 返回方案数 ~Queen(); }; } #endif
#include "Algorithm.h" #include <iostream> #include <iomanip> using namespace std; namespace Algorithm { Queen::Queen(int rowNumber) { RowNumber = rowNumber; Count = 0; Array = new int[RowNumber+1]; } Queen::~Queen() { delete[] Array; } void Queen::FindNext(int nextRow) { if(nextRow > RowNumber) { Count++; cout << "第" << Count << "方案如下:" << endl; for(int i = 1; i <= RowNumber; i++) { for(int j = 1; j < Array[i]; j++) cout << setw(2) <<" " ; cout << setw(2) << Array[i] << endl; } } else { for(int i = 1; i <= RowNumber; i++) { Array[nextRow] = i; if(place(nextRow,i)) FindNext(nextRow+1); } } } bool Queen::place(int row, int column) { for(int i = 1; i < row; i++) { if(Array[row] == Array[i] || abs(row-i) == abs(Array[row] - Array[i])) return false; } return true; } int Queen::GetCount() { return Count; } }
相关文章推荐
- 八皇后问题(3)
- 八皇后问题(牛人非递归版)
- SQL语言的魅力 36秒求解八皇后问题(92种结果)
- 八皇后问题
- 精简八皇后问题
- UVa 639 - Don't Get Rooked, 类八皇后问题
- 八皇后问题和字符串全排列
- 八皇后问题
- 八皇后问题
- 八皇后问题
- 试探与回溯-八皇后问题
- C语言 八皇后问题
- 利用全排列算法八皇后问题和正方体摆数使三组面顶点之和相等问题
- 用 stack 解决“八皇后问题”
- 八皇后问题
- 【基础算法】回溯法与八皇后问题
- 八皇后问题(最简单的递归解法)
- 八皇后问题,上学的时候写的
- 八皇后问题的回朔法求解
- UVA-167The Sultan's Successors(八皇后问题)