洛谷 1219 (八皇后)

八皇后  (DFS)

洛谷p1219

题目描述

检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。

上面的布局可以用序列2 4 6 1 3 5来描述,第i个数字表示在第i行的相应位置有一个棋子,如下:

行号 1 2 3 4 5 6

列号 2 4 6 1 3 5

这道题其实理解了很简单,就是这个点放了棋子,四条线上不再能放棋子

注意:如果横坐标是x,纵坐标是y,那么斜着的坐标就分别是y+x,y-x+n(n代表棋盘的大小,n皇后)

    //如果无法理解,就画画图,自己就看出来了

我们把函数dfs的成员k看成点的横坐标

for循环里的 i 看做y坐标,直接纯dfs就可以写了

 1 void dfs(int k)
 2 {
 3     if(k==n+1)
 4     {
 5         ans++;
 6         if(ans<=3)
 7         {
 8             for(int i=1;i<=n;++i)
 9             {
10                 cout<<v[i]<<" ";
11             }
12             cout<<endl;
13         }
14 
15     }
16     else
17     {
18         for(int i=1;i<=n;++i)
19         {
20             if(b[i]==0&&c[i+k]==0&&d[i-k+n]==0)
21             {
22                 a[k]=1;
23                 b[i]=1;
24                 c[i+k]=1;
25                 d[i-k+n]=1;
26                 v[k]=i;
27                 dfs(k+1);
28                 a[k]=0;
29                 b[i]=0;
30                 c[i+k]=0;
31                 d[i-k+n]=0;
32             }
33         }
34     }
35 }

看着长,不难

    

原文地址:https://www.cnblogs.com/jrfr/p/10501631.html