抽象DFS:2N皇后

简介: 抽象DFS:2N皇后

建议在看此问题之前,先弄懂n皇后问题


问题描述


 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。


 


输入格式


 输入的第一行为一个整数n,表示棋盘的大小。


 接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。


 输出格式


 输出一个整数,表示总共有多少种放法。


 样例输入


4


1 1 1 1


1 1 1 1


1 1 1 1


1 1 1 1


样例输出


2


样例输入


4


1 0 1 1


1 1 1 1


1 1 1 1


1 1 1 1


样例输出


0

#include <iostream>
using namespace std;
int n;
int a[10][10];
int y[10],d1[20],d2[10];
int number;
void dfs(int x,int z){    //z表示黑白皇后。1黑,2白 
  if(x==n && z==2){      //放到最后一行,并且白皇后放完结束 
    number++;
    return;
  }
  if(x==n){
    dfs(0,z+1);       //放完黑皇后,在放白皇后 
    return; 
  } 
  for(int i=0;i<n;i++){   //每一行的每一列 
    if(a[x][i] && y[i]!=3 && y[i]!=z && d1[x+i]!=3 && d1[x+i]!=z && d2[x-i+n]!=3 && d2[x-i+n]!=z){
      a[x][i]=0;
      y[i]+=z;
      d1[x+i]+=z;
      d2[x-i+n]+=z;
      dfs(x+1,z);
      y[i]-=z;
      d1[x+i]-=z;
      d2[x-i+n]-=z; 
      a[x][i]=1;
    } 
  } 
}
int main(){
  cin>>n;
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      cin>>a[i][j];
    }
  }
  dfs(0,1);          //从第0行开始放 
  cout<<number;
  return 0;
} 

z=1时正在放黑皇后,z=2时正在放白皇后,

所以y[i]=0时黑白皇后都可放,z=1时不可放黑皇后,z=2时不可放白皇后,z=3时黑白皇后都不可放。换句话说只要不等于3并且不等于本身z就可以放当前要放的皇后种类。

相关文章
|
5月前
|
存储 算法 Python
Python图论实战:从零基础到精通DFS与BFS遍历,轻松玩转复杂网络结构
【7月更文挑战第11天】图论在数据科学中扮演关键角色,用于解决复杂网络问题。Python因其易用性和库支持成为实现图算法的首选。本文通过问答形式介绍DFS和BFS,图是节点和边的数据结构,遍历用于搜索和分析。Python中图可表示为邻接表,DFS用递归遍历,BFS借助队列。DFS适用于深度探索,BFS则用于最短路径。提供的代码示例帮助理解如何在Python中应用这两种遍历算法。开始探索图论,解锁更多技术可能!
159 6
|
5月前
|
算法 Python
深度挖掘Python图结构:DFS与BFS遍历的艺术,让复杂问题迎刃而解
【7月更文挑战第11天】在数据结构与算法中,图的遍历如DFS和BFS是解决复杂问题的关键。DFS深入探索直至无路可走,回溯找其他路径,适合找任意解;BFS则逐层扩展,常用于找最短路径。在迷宫问题中,BFS确保找到最短路径,DFS则可能不是最短。Python实现展示了两种方法如何在图(迷宫)中寻找从起点到终点的路径。
47 1
|
存储 算法
深度优先遍历(DFS):探索图的奥秘
当进行深度优先遍历(DFS)时,我们需要按照一定的步骤来遍历图中的节点。 选择起始节点:选择图中的一个起始节点作为遍历的起点。 标记已访问:将起始节点标记为已访问,并将其放入数据结构中,比如栈或递归调用。 探索相邻节点:从起始节点开始,探索与其相邻的节点。这是通过查找邻接表来实现的,邻接表存储了每个节点的相邻节点信息。 深入探索:选择一个相邻节点,标记为已访问,并将其放入数据结构中。然后,从这个相邻节点出发,继续探索其相邻节点,形成一个深入的路径。这一步是递归的核心。 回溯:当没有未访问的相邻节点时,回溯到上一个节点,继续探索其他未访问的相邻节点。这可以通过从数据结构中弹出节点来实现,或者从递
313 0
|
7月前
|
算法
深度优先搜索(DFS)的基础理解与实现
深度优先搜索(DFS)的基础理解与实现
95 0
|
数据采集 算法 C++
DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释,剪枝技巧)
1162 0
|
机器学习/深度学习
抽象DFS:N皇后问题
抽象DFS:N皇后问题