八皇后问题
题目:
要在国际象棋棋盘中放八个皇后,使任何两个皇后都不能互相吃。(提示:皇后能吃同一行、同一列、同一对角线的任意棋子。)
————————下面是本人的不正经解析(~ ̄▽ ̄)~———————
题目乍一看很简单
细想一下
并不简单
这题是搜索与回溯算法中较为经典的题
其经典程度不亚于01背包
下面是伪代码详解:(第一次尝试、写的不好请见谅)
我们可以设一个数组a[]来保存和输出
接着设两个变量:i和j
表示横坐标和竖坐标
这道题的关键是判断行、列、斜线上是否有别的皇后
可以分别用三个数组:b[],c[],d[]来处理(因为是逐行判断,所以行可以不处理)
通过上图我们可以发现
从左上角到右下角的直线
行列之差相等
从右上角到左下角的斜线
行列之和相等
所以核心代码为:
int search(int i)
{
for(int j=1;j<=8;j++)
{
if(是否可以放置)
{
放置皇后
标记位置
if(i==8) 输出
else search(i+1);
对放置皇后的位置进行标记,尝试下一个位置可不可以
}
}
}
下面是大家期待已久的代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int b[100],a[100],zd[100],yd[100],sum=1;
int serach(int i)
{
for(int j=1;j<=8;j++)
{
if(b[j]==0&&zd[i+j]==0&&yd[i-j+7]==0)
{
a[i]=j;
b[j]=1;
zd[i+j]=1;
yd[i-j+7]=1;
if(i==8)
{
for(int i=1;i<=8;i++)
cout<<a[i]<<" ";
cout<<endl;
}
else serach(i+1);
b[j]=0;
zd[i+j]=0;
yd[i-j+7]=0;
}
}
}
int main()
{
//freopen("8皇后.in","r",stdin);
//freopen("8皇后.out","w",stdout);
serach(1);
//fclose(stdin);
//fclose(stdout);
return 0;
}