HDU-2553,N皇后问题(DFS+回溯)

简介: HDU-2553,N皇后问题(DFS+回溯)

Problem Description:


在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上。

你的任务是,对于给定的N,求出有多少种合法的放置方法。


Input:


共有若干行,每行一个正整数N≤10,表示棋盘和皇后的数量;如果N=0,表示结束。


Output:


共有若干行,每行一个正整数,表示对应输入行的皇后的不同放置数量。


Sample Input:



1

8

5

0


Sample Output:


1

92

10


AC Code:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
#define N 15
int n,ans,pos[N],a[N];
int place(int k)
{
  int i;
  for(int i=1;i<k;i++)
    if((abs(k-i)==abs(pos[k]-pos[i]))||pos[k]==pos[i])
    //i表示皇后所在的行数,pos[i]表示所在的列数,
    //所以前面那个条件用来判断两个皇后是否在对角线上,后面用来判断是否在同一列上。
    //行数不需要判断,因为他们本身的i就代表的是行数 
      return 0;
  return 1;
}
void dfs(int t)
{
  if(t>n)//皇后个数大于需要摆放的数量 
    ans++;//方案数+1 
  else
  {
    for(int i=1;i<=n;i++)
    {
      pos[t]=i;//第t个皇后所放置的列数 
      if(place(t))//判断是否能放 
        dfs(t+1);//能的话,继续放下一个 
    }
  }
}
int main()
{
  for(int j=1;j<=10;j++)
  {
    n=j;//表示有几个皇后 
    ans=0;//方案数每次都要清零 
    dfs(1);//每次都要从第一个皇后开始 
    a[j]=ans;
  }
  while(cin>>n)//此时已打表完毕 
  {
    if(!n)
      break;
    cout<<a[n]<<endl;//输出对应结果即可 
  }
  return 0;
}
相关文章
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
华为机试HJ44:Sudoku(数独问题,深度优先遍历DFS解法)
132 0
|
6月前
八皇后问题与其深度优先搜索 (DFS) 解法
八皇后问题与其深度优先搜索 (DFS) 解法
74 1
|
移动开发 算法
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
DFS深度优先算法 —— AcWing 842. 排列数字AcWing 843. n-皇后问题
103 0
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(2)
58 0
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(1)
69 0
|
机器学习/深度学习
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
【AcWing】蓝桥杯备赛-深度优先搜索-dfs(3)
93 0
八皇后(dfs全排列)
八皇后(dfs全排列)
83 0
|
机器学习/深度学习 算法 JavaScript
从 DFS 到回溯法,再看 N 皇后问题
DFS 是深度搜索,是暴力的,是一条道走到黑的,是一次性搜到底的!那么,搜到底发现没有路了,就得回退去找另外的路,再继续莽着搜!既然要回退,就必须保存走过每个点的所有信息,包括先后顺序;这个回退的过程就叫 回溯。
|
定位技术
深搜dfs 解决全排列,地图搜索最短距离
深搜dfs 解决全排列,地图搜索最短距离
|
索引
【LeetCode剑指offer12】矩阵中的路径(dfs回溯)
递归参数: 当前字符在矩阵 grid 中的行索引 i 和列索引 j ,当前目标字符(匹配的)在目标字符串 word 中的索引 k 。
117 0
【LeetCode剑指offer12】矩阵中的路径(dfs回溯)