华师一附中OI组
标题:
8Queen问题
[打印本页]
作者:
diggersun
时间:
2015-2-8 10:13
标题:
8Queen问题
8Queen 简易程序
void mysearch(int i); 搜索第I个皇后放在第I行的哪一列
{ int j,k;
if (i>=8) 输出A数组
else for(k=0;k<=7;k++)
if 能放下 {a[i]=k;mysearch(i+1);}
}
bool canplace (i,j) 能放下函数,判断第I行能否放在第J列
{
for(k=0;k<i;k++)
{if (a[k]==j) canplace=false 表示有某个和他一列
if (i-k)/(j-a[k])=+-1 canpalce=false}
}
一个位置被占用,符合三条线的不能被选
1、列 若a[i]=x,则所有的B1[x] 不能被选
2、正对角线 向右下
a[i]=x a[k]=y 请问这四个变量有什么关系 8+i-x=8+k-y b2[i-x]不能被选 纠正一下 偏移问题
3、反对角线 向右上
a[i]=x a[k]=y 请问这四个变量有什么关系 i+x=k+y b3[i+x]不能被选
int b1[8],b2[15],b3[15]
作者:
diggersun
时间:
2015-2-8 10:52
#include <iostream>
#include <cmath>
using namespace std;
int a[8];
int s;
bool canplace(int i,int j)
{
int k;
bool bb=true;
for (k=0; k<=i-1; k++)
if (a[k]==j) bb=false;
else if (abs(i-k)==abs(j-a[k])) bb=false;
return bb;
}
void mysearch(int i)
{
int j,k;
if (i==8)
{
cout<<' '<<s++<<':';
for (j=0; j<=7; j++)cout<<a[j];
cout<<endl;
}
else for (k=0; k<=7; k++)
if (canplace(i,k))
{
a[i]=k;
mysearch(i+1);
}
}
int main()
{
mysearch(0);
return 0;
}
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/)
Powered by Discuz! X3.2