【题目描述】
在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。
【输入】
(无)
【输出】
按给定顺序和格式输出所有八皇后问题的解(见样例)。
【输入样例】
(无)
【输出样例】
No. 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 No. 2 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 ...以下省略
关于此题,在做的过程中,发现如果是以行来进行搜索的话,那么输出的时候要以列来输出,怎么根据输出样例来判断这样的情况呢?
以下代码:change函数是来判断横竖斜有没有皇后,dps是用来进行搜索回溯的函数。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
int a[9][9]={1};
int b[9]={1};//b[i]表示列
int cnt=1;
bool change(int x,int y)
{
//第i行第b[i]列
for(int i=1;i<=x;i++)
{
if(a[i][y]==1) return false;
}
for(int j=1;j<=y;j++)
{
if(a[x][j]==1) return false;
}
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
{
if(fabs(i-x)==fabs(j-y)&&a[i][j]==1)
{
return false;
}
}
}
return true;
}
void dfs(int step)
{
if(step==9)
{
cout<<"No. "<<cnt<<endl;
cnt++;
for(int i=1;i<=8;i++)
{
for(int j=1;j<8;j++)
{
cout<<a[j][i]<<" ";
}
cout<<a[8][i]<<endl;
}
}
else
{
for(int j=1;j<=8;j++)
{
if(change(step,j))
{
a[step][j]=1;
dfs(step+1);
a[step][j]=0;
}
}
}
}
int main()
{
memset(a,0,sizeof(a));
dfs(1);
return 0;
}