数据结构——八皇后问题递归代码实现
2017-04-14 21:13
211 查看
Reference Book: 《Data Structures and Program Design in C++》
------------------------------------------------------------------------------------------------------------------------------------------------
1. Queens类
1.(1)Queens.h
#ifndef QUEENS_H
#define QUEENS_H
const int max_board = 30;
class Queens
{
public:
Queens(int size);
bool unguarded(int col)const;
void insert(int col);
void remove(int col);
bool is_solved()const;
void print()const;
int board_size;
protected:
private:
int count;
bool col_free[max_board]; // 存储列是否被占据
bool upward_free[2*max_board-1]; // 存储自左下到右上的对角线是否被占据
bool downward_free[2*max_board-1]; // 存储自右下到左上的对角线是否被占据
int queen_in_row[max_board]; // 存储每一行queen的列号
static int success;
};
#endif // QUEENS_H
1(2)Queens.cpp
#include "Queens.h"
#include <iostream>
using namespace std;
int Queens::success = 1;
Queens::Queens(int size)
/*Post: 初始化一个Queens类的对象.
*/
{
board_size = size;
count = 0;
int i;
for(i = 0; i < board_size; i++)col_free[i] = true;
for(i = 0; i < (board_size*2-1); i++)upward_free[i] = true;
for(i = 0; i < (board_size*2-1); i++)downward_free[i] = true;
for(i = 0; i < board_size; i++)queen_in_row[i] = -1;
}
bool Queens::unguarded(int col)const
/*Post: 检查第一个空行(count)的col列是否未被皇后守卫, 若是返回true否则返回false
*/
{
return col_free[col] && upward_free[count+col]
&& downward_free[count-col+board_size-1];
}
void Queens::insert(int col)
/*Post: 向第一个空行的col列添加皇后, 并设置列及对角线被守卫.
*/
{
queen_in_row[count] = col; // 第一个空行的索引为count
col_free[col] = false;
upward_free[count+col] = false;
downward_free[count-col+board_size-1] = false;
count++;
}
void Queens::remove(int col)
/*Post: 移除最后一个非空行col列的皇后, 并重新设置列及对角线未被守卫.
*/
{
count--;
queen_in_row[count] = -1;
col_free[col] = true;
upward_free[count+col] = true;
downward_free[count-col+board_size-1] = true;
}
bool Queens::is_solved()const
/*Post: 若填入的皇后数等于棋盘大小返回true, 否则返回false.
*/
{
return count==board_size;
}
void Queens::print()const
/*Post: 打印出皇后在棋盘上的分布图.
*/
{
cout << "case #" << success++ << ":" << endl;
for(int row = 0; row < board_size; row++)
{
for(int col = 0; col < board_size; col++)
{
if(queen_in_row[row]==col)
cout << "*";
else
cout << "-";
}
cout << endl;
}
cout << endl;
}
2. main.cpp
#include <iostream>
#include "Queens.h"
using namespace std;
void solve_from(Queens &configuration)
/*Post: 对于大小为board_size的棋盘, 通过插入和移除回溯的方法寻找可行的棋盘配置并打印.
Uses: Queens类和回溯的方法.
*/
{
if(configuration.is_solved())configuration.print();
else
for(int col = 0; col < configuration.board_size; col++)
if(configuration.unguarded(col))
{
configuration.insert(col);
solve_from(configuration);
configuration.remove(col);
}
}
int main()
{
int board_size;
cin >> board_size;
if(board_size<0 || board_size>max_board)
cout << "The number is out of range!" << endl;
else
{
Queens configuration(board_size);
solve_from(configuration);
}
return 0;
}
------------------------------------------------------------------------------------------------------------------------------------------------
1. Queens类
1.(1)Queens.h
#ifndef QUEENS_H
#define QUEENS_H
const int max_board = 30;
class Queens
{
public:
Queens(int size);
bool unguarded(int col)const;
void insert(int col);
void remove(int col);
bool is_solved()const;
void print()const;
int board_size;
protected:
private:
int count;
bool col_free[max_board]; // 存储列是否被占据
bool upward_free[2*max_board-1]; // 存储自左下到右上的对角线是否被占据
bool downward_free[2*max_board-1]; // 存储自右下到左上的对角线是否被占据
int queen_in_row[max_board]; // 存储每一行queen的列号
static int success;
};
#endif // QUEENS_H
1(2)Queens.cpp
#include "Queens.h"
#include <iostream>
using namespace std;
int Queens::success = 1;
Queens::Queens(int size)
/*Post: 初始化一个Queens类的对象.
*/
{
board_size = size;
count = 0;
int i;
for(i = 0; i < board_size; i++)col_free[i] = true;
for(i = 0; i < (board_size*2-1); i++)upward_free[i] = true;
for(i = 0; i < (board_size*2-1); i++)downward_free[i] = true;
for(i = 0; i < board_size; i++)queen_in_row[i] = -1;
}
bool Queens::unguarded(int col)const
/*Post: 检查第一个空行(count)的col列是否未被皇后守卫, 若是返回true否则返回false
*/
{
return col_free[col] && upward_free[count+col]
&& downward_free[count-col+board_size-1];
}
void Queens::insert(int col)
/*Post: 向第一个空行的col列添加皇后, 并设置列及对角线被守卫.
*/
{
queen_in_row[count] = col; // 第一个空行的索引为count
col_free[col] = false;
upward_free[count+col] = false;
downward_free[count-col+board_size-1] = false;
count++;
}
void Queens::remove(int col)
/*Post: 移除最后一个非空行col列的皇后, 并重新设置列及对角线未被守卫.
*/
{
count--;
queen_in_row[count] = -1;
col_free[col] = true;
upward_free[count+col] = true;
downward_free[count-col+board_size-1] = true;
}
bool Queens::is_solved()const
/*Post: 若填入的皇后数等于棋盘大小返回true, 否则返回false.
*/
{
return count==board_size;
}
void Queens::print()const
/*Post: 打印出皇后在棋盘上的分布图.
*/
{
cout << "case #" << success++ << ":" << endl;
for(int row = 0; row < board_size; row++)
{
for(int col = 0; col < board_size; col++)
{
if(queen_in_row[row]==col)
cout << "*";
else
cout << "-";
}
cout << endl;
}
cout << endl;
}
2. main.cpp
#include <iostream>
#include "Queens.h"
using namespace std;
void solve_from(Queens &configuration)
/*Post: 对于大小为board_size的棋盘, 通过插入和移除回溯的方法寻找可行的棋盘配置并打印.
Uses: Queens类和回溯的方法.
*/
{
if(configuration.is_solved())configuration.print();
else
for(int col = 0; col < configuration.board_size; col++)
if(configuration.unguarded(col))
{
configuration.insert(col);
solve_from(configuration);
configuration.remove(col);
}
}
int main()
{
int board_size;
cin >> board_size;
if(board_size<0 || board_size>max_board)
cout << "The number is out of range!" << endl;
else
{
Queens configuration(board_size);
solve_from(configuration);
}
return 0;
}
相关文章推荐
- 程序员面试宝典之数据结构基础---⑤单链表逆序的递归与非递归实现
- 5行代码 不用递归实现无限分类数据的树形格式化
- 数据结构中线性表的c语言代码实现
- 【数据结构与算法】【排序】归并排序的代码实现
- 【数据结构与算法】【排序】直接插入排序的代码实现
- 数据结构之二叉树的非递归实现及“狡猾”的指针
- 数据结构:二分查找的递归与非递归实现--C实现
- 数据结构——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 【数据结构与算法】汉诺塔算法——C语言递归实现
- 【数据结构与算法】【排序】堆排序的代码实现
- java数据结构之线性表代码实现
- JSTL实现递归展示树型结构数据!
- c++递归实现n皇后问题代码(八皇后问题)
- 【数据结构与算法】【查找】哈希表的代码实现
- 5行代码足矣,不用递归实现无限分类数据的树形格式化
- 数据结构(C#)--递归和动态规划法实现斐波那契数列的方法
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 【数据结构与算法】【排序】希尔排序的代码实现
- 【数据结构与算法】【排序】冒泡排序的代码实现