在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
// eightqueen.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
using namespace std;
//计算八皇后棋局的排放方式个数
int countnum=0;
//判断位置(row,col)是否适合放棋子
int isSafePosition(int row,int col,int (*chessQueen)[8])//chessQueen表示棋盘
{
int flagRow=0,flagCol=0,flagLeftUp=0,flagRightUp=0,flagLeftDown=0,flagRightDown=0;//各方向标志位
for(int i=0;i<8;i++)
{
if(chessQueen[i][col]!=0)
{
flagCol=1;//列标志置1,退出循环
break;
}
if(chessQueen[row][i]!=0)
{
flagRow=1;//行标志置1,退出循环
break;
}
}
//判断左上
for(int i=row,j=col;i>=0&&j>=0;i--,j--)
{
if(chessQueen[i][j]!=0)
{
flagLeftUp=1;
break;
}
}
//判断右下
for(int i=row,j=col;i<8&&j<8;i++,j++)
{
if(chessQueen[i][j]!=0)
{
flagRightDown=1;
break;
}
}
//判断左下
for(int i=row,j=col;i<8&&j>=0;i++,j--)
{
if(chessQueen[i][j]!=0)
{
flagLeftDown=1;
break;
}
}
//判断右上
for(int i=row,j=col;i>=0&&j<8;i--,j++)
{
if(chessQueen[i][j]!=0)
{
flagRightUp=1;
break;
}
}
if(flagRightUp||flagLeftDown||flagRightDown||flagLeftUp||flagCol||flagRow)
{
return 0;
}
return 1; //返回1即该位置可用
}
/****放置棋子,更新布局****/
/****输出为一个0-1矩阵,有棋子的地方为1****/
/****无棋子的地方为0****/
void placeQueen(int row,int n,int (*chessQueen)[8])
{
int chessCopy[8][8];
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
chessCopy[i][j]=chessQueen[i][j];
}
}
if(row==8)
{
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
cout<<chessCopy[i][j]<<" ";
}
cout<<endl;
}
countnum++;
cout<<countnum<<endl;
cout<<endl;
}else{
/****下面这段代码是递归的关键****/
/****在第row行循环检测每一列位置是否适合放置棋子****/
for(int k=0;k<n;k++)
{
if(isSafePosition(row,k,chessQueen))
{
for(int m=0;m<8;m++)
{
chessCopy[row][m]=0;
}
chessCopy[row][k]=1;
placeQueen(row+1,n,chessCopy);
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int chess[8][8];
for(int i=0;i<8;i++)
{
for(int j=0;j<8;j++)
{
chess[i][j]=0;
}
}
placeQueen(0,8,chess);
cout<<"八皇后问题的解决方案个数: "<<endl;
cout<<countnum<<endl;
return 0;
}
cmd.exe没有把92种全部显示出来是因为其缓冲区不够,可以通过调试或者输出文件的方式把92种方法显示出来