算法训练 王、后传说 (n皇后问题) 回溯

思路

考察搜索
给定一个棋盘,设左上角的坐标为原点 1 1 (1,1) ,已经放好的皇后坐标为 i j (i,j) ,不同行,不同列,不同斜线的新皇后坐标为 ( r , c ) (r,c) ,则关系如下:

  1. 横向 i r i\ne r
  2. 纵向 j c j\ne c
  3. 斜对角从 ( i , j ) (i,j) ( r , c ) (r,c) 有四种情况 ( i + a , j + a ) , ( i a , j + a ) , ( i + a , j a ) , ( i a , j a ) (i+a,j+a),(i-a,j+a),(i+a,j-a),(i-a,j-a) 综合起来就是 i r = j c |i-r|=|j-c| 所以斜对角需满足 i r j c |i-r|\ne |j-c|

code

#include <bits/stdc++.h>
using namespace std;
int n,x,y,tol=0;
int col[14],matrix[14][14];
bool check(int r,int c){
    if(matrix[r][c]) return false;
    for(int i=1;i<r;i++)
        if(col[i]==c||abs(col[i]-c)==abs(i-r)) return false;
    return true;
}
void dfs(int r){
    if(r==n+1){
        tol++;
        return;
    }
    for(int c=1;c<=n;c++){
        col[r]=c;
        if(check(r,c)) 
            dfs(r+1);
    }
}
int main(){
    cin>>n>>x>>y;
    for(int dx=-1;dx<=1;dx++)//皇上的九宫格不能放皇后
        for(int dy=-1;dy<=1;dy++)
            matrix[x+dx][y+dy]=1;
    dfs(1);
    cout<<tol<<endl;
    return 0;
}

发布了83 篇原创文章 · 获赞 9 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43077261/article/details/103730997