华师一附中OI组

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

1209讲义

[复制链接]

61

主题

147

帖子

563

积分

超级版主

Rank: 8Rank: 8

积分
563
跳转到指定楼层
楼主
发表于 2015-12-13 11:44:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

8皇后问题

有一个难点是判断在同一列,同一对角线的情况,考虑他的斜率就很好理解了
  1. #include <iostream>
  2. using namespace std;
  3. int a[8];
  4. bool b1[8],b2[16],b3[16]; //分别表示列,左对角线,右对角线是否可以放

  5. void mysearch1(int i)
  6. {
  7.     int j,k;
  8.     if (i>=8)  {for (j=0; j<=7; j++) cout <<a[j]<<' '; cout<<endl; }
  9.     else  for (k=0; k<=7; k++)
  10.         { if (b1[k] && b2[i+k] && b3[i-k+8])
  11.             {   a[i]=k;
  12.                 b1[k]=b2[i+k]=b3[i-k+8]=false; //体会这里的置位情况  斜率关系
  13.                 mysearch1(i+1);
  14.                 b1[k]=b2[i+k]=b3[i-k+8]=true;
  15.             }
  16.         }
  17. }
  18. bool canplace (int i ,int j)
  19. {
  20.     bool b=true;
  21.     for (int k=0; k<=i-1; k++)
  22.         if ((a[k]==j) ||(a[k]-k==i-j)||(a[k]+k==i+j)) b=false;
  23.     return b;
  24. }
  25. void mysearch2(int i)
  26. {
  27.     int j,k;
  28.     if (i>=8){for (j=0; j<=7; j++) cout <<a[j]<<' ';   cout<<endl;   }
  29.     else  for (k=0; k<=7; k++)
  30.             if (canplace(i,k))    {a[i]=k; mysearch2(i+1); }
  31. }
  32.     int main()
  33.     {   for (i=0; i<=7; i++) b1[i]=true;
  34.         for (i=0; i<=15; i++) b2[i]=b3[i]=true;
  35.         mysearch2(0);
  36. }


  37. 间隔排列
  38. #include<iostream>
  39. using namespace std;
  40. int n=3;
  41. int i,a[100],b[100];
  42. void mysearch(int i)
  43. {  int j,k;
  44.    if (i>=2*n) {for(j=0;j<=2*n-1;j++) cout<<a[j]+1;cout<<endl;} //递归出口,当2*N的位子上都摆满了
  45.    else  if (a[i]>-1) mysearch(i+1);  //若此位置已经有数字了,就直接搜索下一个
  46.    else
  47.      for (k=0;k<=n-1;k++)
  48.         if ((a[i]==-1) && (i+k+2<=2*n-1) && (a[i+k+2]==-1) && b[k])
  49.             //四个条件 1此位置没有数字,2此数字没有被占用 3间隔一定位置后面的那个数字不超范围4也没有数字
  50.    {    a[i]=a[i+k+2]=k;b[k]=false;mysearch(i+1);
  51.         a[i]=a[i+k+2]=-1;b[k]=true;
  52.    }
  53. }
  54. int main()
  55. {
  56.     for (i=0;i<=2*n-1;i++) a[i]=-1;
  57.     for (i=0;i<=n-1;i++) b[i]=true;
  58.     mysearch(0);
  59.     }

复制代码


回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-6 09:36 , Processed in 0.098942 second(s), 24 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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