八皇后问题 就是在8*8格子上放8个皇后 皇后是可以横行竖行斜行行走 他们之间不能存在可以被吃的关系
算法 迭代回溯法 思路是这样 红色框代表put 函数里的if没有通过 就不再有进一步迭代(子树) 进行下一个1皇后2列的进一步匹配
数组q[] key是行数 value是列数 max1 n皇后
图 #define h 皇后
迭代过程大概就是这样 红色就是check失败不进行进一步匹配
c++代码如下
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
int i,q[100],j,k,m,max1,sum;
int check(int n)
{
int i;
for(i = 0; i < n; i++)
{
if(q[i] == q[n] || abs(q[i] - q[n]) == (n - i)) //检查之前的点有没有重行
{
return 0;
}
}
return 1;
}
void put(int n)
{ int i; //这里第一遍忘记加了,整错了,这里i必须是局部变量
for(i=0;i<max1;i++)
{ q[n]=i;
if(check(n)) //如果改点可用 则
{
if(n==max1-1)
{
for(int j=0;j<max1;j++)
cout<<"("<<j<<" "<<q[j]<<")";
cout<<endl;
sum++;
}
else put(n+1); //进行下一行的列选择 迭代
}
}
}
int main()
{ sum=0;
while(cin>>max1)
{
put(0);
cout<<sum<<endl;
}
return 0;
}