free是c/c++的关键字,换一个词。

完整的程序
#include <iostream>
#include <conio.h>
using namespace std;
int i,j,k,N,n; //循环变量
void BacktoHome();
void Introduction();
void SpecialOne();
void SpecialMost();
void SpecialLeast();
void PrintAll();
void Away();
void Initial(void)
{
cout<<endl<<endl<<endl;
cout<<" 八 皇 后 问 题 \n"<<flush;
cout<<" -------------------------------------------------------------------------\n"<<flush;
cout<<" 制作人:lzh \n\n\n"<<flush;
cout<<" 请选择以下功能: \n\n"<<flush;
cout<<" 1.问题简介 \n\n"<<flush;
cout<<" 2.指定第一个皇后的位置情况下有几种方案 \n\n"<<flush;
cout<<" 3.在什么位置固定一个皇后,方案的数量最多?具体有哪些方案? \n\n"<<flush;
cout<<" 4.在什么位置固定一个皇后,方案的数量最少?具体有哪些方案? \n\n"<<flush;
cout<<" 5.八皇后问题共有几种解决方案? \n\n"<<flush;
cout<<" 6.退出 \n\n"<<flush;
cout<<" 请输入你的选择:";
int choice,check=-1;
do{
cin>>choice;cin.ignore(80,'\n');
switch(choice){
case 1: Introduction(); break;
case 2: SpecialOne(); break;
case 3: SpecialMost(); break;
case 4: SpecialLeast(); break;
case 5: PrintAll(); break;
case 6: Away(); break;
default: cout<<"你的输入有误,请重新输入!\n";
}
}while(check);
}
enum States { used, free1 };
class Stack {
int data[8];
int Top;
public:
Stack() { Top = 0; }
~Stack() { }
int Size() { return Top; }
bool Push(int);
bool Pop(int &);
bool StackTop(int &);
friend void Empty(Stack &); //置空栈内数据, 在Solve函数执行前使用
}rowStack;
bool Stack::Push(int d)
{
if (Top == 8)
return false;
else {
data[Top] = d;
Top++;
return true;
}
}
bool Stack::Pop(int &d)
{
if (!Top)
return false;
else {
Top--;
d = data[Top];
return true;
}
}
bool Stack::StackTop(int &d)
{
if (!Top)
return false;
else {
d = data[Top-1];
return true;
}
}
class Board //一盘棋8*8
{
char board[8][8];
States Rows[8], DiagsLR[15], DiagsRL[15]; //行,左右斜线
char PrintBoard[100][8][8]; //输出的棋盘
public:
int nNum; //保存一组解的数目
static int AllNum; //保存所有方案的数目
Board();
bool isAttacked(int, int); //处理冲突
void PlaceQueen(int, int);
void RemoveQueen(int, int);
void Print(int,int); //前一个参数保存一行输出解的个数,后一个参数保存共输出解的数目
void SaveBoard(); //解决一组解后保存到PrintBoard数组中
void SaveAll(); //保存所有八皇后问题的解
friend void Empty(Board &); //置空栈内数据, 在Solve函数执行前使用
}myBoard;
int Board::AllNum;
Board::Board() //构造函数,初始化为空
{
for(int i=0; i<8; i++)
{
Rows[i] = free1;
for(int j=0; j<8; j++) board[i][j] = '.';
}
for(int k=0; k<15; k++) DiagsLR[k] = DiagsRL[k] = free1;
}
bool Board::isAttacked(int row, int col) //是否冲突,是返回TRUE,否返回FALSE
{
int diagLR = col-row+7;
int diagRL = row+col;
if (Rows[row] == used || DiagsLR[diagLR] == used || DiagsRL[diagRL] == used)
return true;
return false;
}
void Board::PlaceQueen(int row, int col) //放皇后
{
int diagLR = col-row+7; //左对角线元素
int diagRL = row+col; //右对角线元素
board[row][col] = 'Q';
Rows[row] = used;
DiagsLR[diagLR] = used;
DiagsRL[diagRL] = used;
}
void Board::RemoveQueen(int row, int col) //移去皇后
{
int diagLR = col-row+7;
int diagRL = row+col;
board[row][col] = '.';
Rows[row] = free1;
DiagsLR[diagLR] = free1;
DiagsRL[diagRL] = free1;
}
void Board::Print(int c,int num)
{
if(c==N){ //输出对应的所有解,一行排列五组
for(i=0;i<num;i++){
if(num-i<N) break; //当剩余解数大于五组可以并排显示时
for(j=0;j<8;j++){
for(n=0;n<N;n++){
for(k=0;k<8;k++)
cout<<PrintBoard[i+n][j][k]<<' '<<flush;
cout<<'\t';
}
cout<<'\n';
} //至此已经完成输出一排五组解
i+=N-1; //跳过已输出的五组解
cout<<"按任意键继续. . .\n"<<flush;
getch();
}
if(num-i<N&&(num-i)!=0) //当剩余方案不足五个且多于零个时
{
int n=i;
for(j=0;j<8;j++){
while(n!=num)
{
for(k=0;k<8;k++)
cout<<PrintBoard[n][j][k]<<' '<<flush;
cout<<'\t';
n++;
}
cout<<'\n';
n=i; //使n指向第i个解的位置
}
}
cout<<"输出完毕,共输出了"<<num<<"组方案\n"<<flush;
cout<<"按任意键返回\n"<<flush;
getch();
BacktoHome();
}
if(c==1){
for(i=0;i<num;i++){
for(j=0;j<8;j++){
for(k=0;k<8;k++)
cout<<PrintBoard[i][j][k]<<' ';
cout<<'\n';
}
cout<<"按任意键继续\n";
getch();
}
cout<<"输出完毕,共输出了"<<num<<"组方案\n";
cout<<"按任意键返回\n";
getch();
BacktoHome();
}
}
void Empty(Board &myBoard) //置空栈内数据,以便下一次Solve函数的执行
{
for(int i=0; i<8; i++)
{
myBoard.Rows[i] = free1;
for(int j=0; j<8; j++) myBoard.board[i][j] = '.';
}
for(int k=0; k<15; k++)
myBoard.DiagsLR[k] = myBoard.DiagsRL[k] = free1;
}
void Empty(Stack &rowStack) //置空栈内数据,以便下一次Solve函数的执行
{
rowStack.Top = 0;
}
void Board::SaveBoard()
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
PrintBoard[nNum][i][j]=board[i][j];
nNum++;
}
void Board::SaveAll()
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
PrintBoard[Board::AllNum][i][j]=board[i][j];
Board::AllNum++;
}
void Solve(int qRow,int qCol) //实际处理八皇后置放问题
{
int row,col,exitLoop,attacked;
myBoard.nNum=0; //每执行一次Solve函数,先将nNum置空,并在函数执行后及时保存nNum的值
Empty(myBoard);
Empty(rowStack);//置空栈内数据,以便下一次Solve函数的执行
myBoard.PlaceQueen(qRow,qCol);
if (qCol == 0) col = 1;
else col = 0;
row = 0;
do
{
while(row < 8) //超界
{
exitLoop = 0;
if (!(attacked = myBoard.isAttacked(row,col))) //若无皇后,条件成立
{
myBoard.PlaceQueen(row,col); //放皇后
rowStack.Push(row); //入栈
row = 0;
col++;
if (col == qCol)
col++;
exitLoop = 1;
}
if (exitLoop) break; //找到退出本层循环
else row++; // 到下一行
}
if (col == 8)
{
myBoard.SaveBoard();
row = 8;
}
if (row == 8)
{
rowStack.Pop(row); col--; //到前一列
if (col == qCol) col--;
myBoard.RemoveQueen(row,col); //移去皇后
row++; //找下一个位置
}
}while(col>=0);
}
void SolveAll()
{
for(i=0;i<7;i++){
int row=i,col=0,exitLoop,attacked;
Empty(myBoard);
Empty(rowStack);//置空栈内数据,以便下一次Solve函数的执行
do
{
while(row < 8) //超界
{
exitLoop = 0;
if (!(attacked = myBoard.isAttacked(row,col))) //若无皇后,条件成立
{
myBoard.PlaceQueen(row,col); //放皇后
rowStack.Push(row); //入栈
row = 0;
col++;
exitLoop = 1;
}
if (exitLoop) break; //找到退出本层循环
else row++; // 到下一行
}
if (col == 8)
{
myBoard.SaveAll();
row = 8;
}
if (row == 8)
{
rowStack.Pop(row);
col--; //到前一列
myBoard.RemoveQueen(row,col); //移去皇后
row++; //找下一个位置
}
}while(col>=0);
}
}
void BacktoHome()
{
// system("cls");
Initial();
}
void SpecialOne()
{
// system("cls");
int row,col;
do{
cout<<"输入第一个皇后的位置(1~8):\n行坐标:";
cin>>row;
cout<<"列坐标:";
cin>>col;
if(!(row<=8&&row>=1&&col<=8&&col>=1))
cout<<"你的输入有误,请重新输入:\n";
}while(!(row<=8&&row>=1&&col<=8&&col>=1));
Solve(row-1,col-1);
cout<<"固定该位置的皇后后共有"<<myBoard.nNum<<"组方案\n";
cout<<"是否输出所有这些方案?(Y/N)";
char c='a';
while(c){
cin>>c;cin.ignore(80,'\n');
if(c=='y'||'Y'){
myBoard.Print(N,myBoard.nNum);
break;
}
else if(c=='n'||'N'){
BacktoHome();
break;
}
else cout<<"你的输入有误,请重新输入!\n";
}
}
void SpecialMost()
{
// system("cls");
int qRow,qCol; //储存最多方案解皇后的位置
int row,col=-1;
int max=0; //储存最多方案解的个数
cout<<"可以把皇后固定在某一列上来查找最多解\n";
cout<<"把皇后固定在哪一列?";
do{
cin>>col; cin.ignore(80,'\n');
if(!(col<=8&&col>=1))
cout<<"你的输入有误,请重新输入!";
}while(!(col<=8&&col>=1));
for(row=0;row<8;row++){
Solve(row,col-1);
if(max<myBoard.nNum){
max=myBoard.nNum;
qRow=row;qCol=col;
}
}
cout<<"\n在你输入的这一列位置上,八皇后问题方案解最多的有"<<max<<"种\n"<<flush;
cout<<"它的位置在第"<<qRow+1<<"行,"<<"第"<<qCol<<"列\n"<<flush;
cout<<"是否输出该情况下的所有方案?(Y/N)"<<flush;
char c;
do{
cin>>c;//cin.ignore(80,'\n');
if(c=='Y'||'y'){
myBoard.Print(N,max);
break;
}
else if(c=='N'||'n'){
BacktoHome();
break;
}
else cout<<"你的输入有误,请重新输入!";
}while(c);
}
void SpecialLeast()
{
// system("cls");
int qRow,qCol; //储存最少方案解皇后的位置
int row,col=-1;
int min=100; //储存最少方案解的个数
cout<<"可以把皇后固定在某一列上来查找最少解\n";
cout<<"把皇后固定在哪一列?";
do{
cin>>col; //cin.ignore(80,'\n');
if(!(col<=8&&col>=1))
cout<<"你的输入有误,请重新输入!";
}while(!(col<=8&&col>=1));
for(row=0;row<8;row++){
Solve(row,col-1);
if(min>myBoard.nNum){
min=myBoard.nNum;
qRow=row;qCol=col;
}
}
cout<<"在你输入的这一列位置上,八皇后问题方案解最少的有"<<min<<"种\n"<<flush;
cout<<"它的位置在第"<<qRow+1<<"行,"<<"第"<<qCol<<"列\n"<<flush;
cout<<"是否输出该情况下的所有方案?(Y/N)"<<flush;
char c;
do{
cin>>c;//cin.ignore(80,'\n');
if(c=='Y'||'y'){
myBoard.Print(N,min);
break;
}
else if(c=='N'||'n'){
BacktoHome();
break;
}
else cout<<"你的输入有误,请重新输入!";
}while(c);
}
void PrintAll()
{
SolveAll();
cout<<"八皇后问题共有"<<Board::AllNum<<"种解方案"<<endl<<flush;
cout<<"是否输出所有这些解?(Y/N)"<<flush;
char c;
do{
cin>>c;
if(c=='Y'||'y')
myBoard.Print(N,Board::AllNum);
else if(c=='N'||'n')
break;
else
cout<<"你的输入有误,请重新输入!";
}while(c);
cout<<"按任意键返回";
getch();
BacktoHome();
}
void Introduction()
{
cout<<"输出关于八皇后问题的介绍"<<flush;
cout<<"按任意键返回\n"<<flush;
getch();
BacktoHome();
}
void Away()
{
// system("cls");
cout<<endl<<endl<<endl;
cout<<" 八 皇 后 问 题 \n"<<flush;
cout<<" -------------------------------------------------------------------------\n"<<flush;
cout<<" 制作人:lzh \n\n\n"<<flush;
cout<<endl<<flush;
cout<<" "<<endl<<flush;
cout<<" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "<<endl<<flush;
cout<<" * * "<<endl<<flush;
cout<<" * 谢谢你对本软件的支持 欢迎再次使用 * "<<endl<<flush;
cout<<" * * "<<endl<<flush;
cout<<" ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ "<<endl<<flush;
cout<<"\n\n\n\n\n\n\n\n\n"<<flush;
}
int main()
{
Initial();
}