华师一附中OI组
标题: 1209讲义 [打印本页]
作者: diggersun 时间: 2015-12-13 11:44
标题: 1209讲义
8皇后问题
有一个难点是判断在同一列,同一对角线的情况,考虑他的斜率就很好理解了
- #include <iostream>
- using namespace std;
- int a[8];
- bool b1[8],b2[16],b3[16]; //分别表示列,左对角线,右对角线是否可以放
- void mysearch1(int i)
- {
- int j,k;
- if (i>=8) {for (j=0; j<=7; j++) cout <<a[j]<<' '; cout<<endl; }
- else for (k=0; k<=7; k++)
- { if (b1[k] && b2[i+k] && b3[i-k+8])
- { a[i]=k;
- b1[k]=b2[i+k]=b3[i-k+8]=false; //体会这里的置位情况 斜率关系
- mysearch1(i+1);
- b1[k]=b2[i+k]=b3[i-k+8]=true;
- }
- }
- }
- bool canplace (int i ,int j)
- {
- bool b=true;
- for (int k=0; k<=i-1; k++)
- if ((a[k]==j) ||(a[k]-k==i-j)||(a[k]+k==i+j)) b=false;
- return b;
- }
- void mysearch2(int i)
- {
- int j,k;
- if (i>=8){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; mysearch2(i+1); }
- }
- int main()
- { for (i=0; i<=7; i++) b1[i]=true;
- for (i=0; i<=15; i++) b2[i]=b3[i]=true;
- mysearch2(0);
- }
- 间隔排列
- #include<iostream>
- using namespace std;
- int n=3;
- int i,a[100],b[100];
- void mysearch(int i)
- { int j,k;
- if (i>=2*n) {for(j=0;j<=2*n-1;j++) cout<<a[j]+1;cout<<endl;} //递归出口,当2*N的位子上都摆满了
- else if (a[i]>-1) mysearch(i+1); //若此位置已经有数字了,就直接搜索下一个
- else
- for (k=0;k<=n-1;k++)
- if ((a[i]==-1) && (i+k+2<=2*n-1) && (a[i+k+2]==-1) && b[k])
- //四个条件 1此位置没有数字,2此数字没有被占用 3间隔一定位置后面的那个数字不超范围4也没有数字
- { a[i]=a[i+k+2]=k;b[k]=false;mysearch(i+1);
- a[i]=a[i+k+2]=-1;b[k]=true;
- }
- }
- int main()
- {
- for (i=0;i<=2*n-1;i++) a[i]=-1;
- for (i=0;i<=n-1;i++) b[i]=true;
- mysearch(0);
- }
复制代码
欢迎光临 华师一附中OI组 (http://hsyit.cn/) |
Powered by Discuz! X3.2 |