华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1555|回复: 2
打印 上一主题 下一主题

8Queen问题

[复制链接]

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
跳转到指定楼层
楼主
发表于 2015-2-8 10:13:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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]




回复

使用道具 举报

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
沙发
 楼主| 发表于 2015-2-8 10:52:25 | 只看该作者
  1. #include <iostream>
  2. #include <cmath>
  3. using namespace std;
  4. int a[8];
  5. int s;
  6. bool canplace(int i,int j)
  7. {
  8.     int k;
  9.     bool bb=true;
  10.     for (k=0; k<=i-1; k++)
  11.         if (a[k]==j) bb=false;
  12.         else if (abs(i-k)==abs(j-a[k])) bb=false;
  13.     return bb;
  14. }
  15. void mysearch(int i)
  16. {
  17.     int j,k;
  18.     if (i==8)
  19.     {
  20.         cout<<' '<<s++<<':';
  21.         for (j=0; j<=7; j++)cout<<a[j];
  22.         cout<<endl;
  23.     }
  24.     else for (k=0; k<=7; k++)
  25.             if (canplace(i,k))
  26.             {
  27.                 a[i]=k;
  28.                 mysearch(i+1);
  29.             }
  30. }
  31. int main()
  32. {
  33.     mysearch(0);
  34.     return 0;
  35. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 14:21 , Processed in 0.092004 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表