//queens.h
#pragma once
const int maxboard = 30;
class Queens
{
public:
Queens(int size);
bool is_solved()const;
void print();
bool ungarded(int col)const;//优化后
void insert(int col);
void remove(int col);
void solve_from(Queens &configuration);
private:
int board_size;
int count;
bool col_free[maxboard];//一些优化操作
bool upward_free[2 * maxboard - 1];
bool downward_free[2 * maxboard - 1];
int queen_in_row[maxboard];
};
//queens.cpp
#include"queens.h"
#include<iostream>
using namespace std;
bool Queens::is_solved()const{
return count == board_size;
}
void Queens::print()
{
for (int row = 0; row < board_size; row++) {
for (int i = 0; i < queen_in_row[row]; i++)cout << " 0 ";
cout << " 1 ";
for (int i = queen_in_row[row] + 1; i < board_size; i++)cout << " 0 ";
cout << endl;
}
cout <<"----------------------------------------------" <<endl;
}
bool Queens::ungarded(int col) const
{
return (col_free[col] && upward_free[count + col] && downward_free[count - col + board_size - 1]);
}
void Queens::insert(int col)
{
queen_in_row[count] = col;
col_free[col] = false;
upward_free[count + col] = false;
downward_free[count - col + board_size - 1] = false;
count++;
}
void Queens::remove(int col)
{
count--;
queen_in_row[count] = 0;
col_free[col] = true;
upward_free[count + col] = true;
downward_free[count - col + board_size - 1] = true;
}
void Queens::solve_from(Queens & configuration)
{
if (configuration.is_solved());//configuration.print();
else {
for (int col = 0; col < board_size; col++) {
if (configuration.ungarded(col)) {
configuration.insert(col);
solve_from(configuration);
configuration.remove(col);
}
}
}
}
Queens::Queens(int size)
{
board_size = size;
count = 0;
for (int i = 0; i < maxboard; i++)col_free[i] = true;
for (int i = 0; i < 2 * maxboard - 1; i++)upward_free[i] = true;
for (int i = 0; i < 2 * maxboard - 1; i++)downward_free[i] = true;
}
//main.cpp
#include"queens.h"
#include<iostream>
#include<Windows.h>
using namespace std;
void main() {
while (1) {
DWORD start_time = GetTickCount();
{
cout << "请输入需要计算的皇后数量(maxcount=30)。" << endl;
int count;
cin >> count;
Queens configuration(count);
configuration.solve_from(configuration);
}
DWORD end_time = GetTickCount();
cout << "The run time is:" << (end_time - start_time) << "ms!" << endl;//输出运行时间
}
}