今天心情好,多写一点嘿嘿
#include <iostream>
#include <stdio.h>
using namespace std;
#define N 8
int count=0;
int a[N][N]={0};
void print()//打印棋盘
{
cout<<"这是第"<<count<<"种答案"<<endl;
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
printf("%d ",a[i][j]);
puts("");
}
cout<<endl;
}
int OK(int i,int j)//判断坐标为(i,j)的位置能不能放棋子
{
int flag=1,s,u;
for(int k=0;k<N;k++) //判断所在行和列有没有棋子
if(a[i][k]==1||a[k][j]==1)
flag=0;
for(s=i-1,u=j-1;s>=0&&u>=0;s--,u--)//判断左上角有没有棋子,第一次这种技巧,需要多多学习!
if(a[s][u]==1)
flag=0;
for(s=i+1,u=j-1;s<N&&u>=0;s++,u--)//判断左下角有没有棋子
if(a[s][u]==1)
flag=0;
for(s=i-1,u=j+1;s>=0&&u<N;s--,u++)//判断右上角有没有棋子
if(a[s][u]==1)
flag=0;
for(s=i+1,u=j+1;s<N&&u<N;s++,u++)//判断右上角有没有棋子
if(a[s][u]==1)
flag=0;
return flag;
}
void Queen(int i)//对第i行的每一列进行考察
{
if(i>=0&&i<N)//如果不是最后一行
{
for(int j=0;j<N;j++)
if(OK(i,j))
{
a[i][j]=1;
if(i==N-1)//对最后一行需要进行特别照顾
{
count++;
print();
}
Queen(i+1);
a[i][j]=0;//回溯
}
}
}
int main()
{
Queen(0);//从第0行开始
cout<<"共"<<count<<"种答案"<<endl;
return 0;
}