n皇后问题

Posted 孤独风中一匹狼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了n皇后问题相关的知识,希望对你有一定的参考价值。

问题描述(转换为矩阵形式):

n行n列的矩阵,每一行,每一列,没有斜线,只能有一个1,对应情况有多少种?

1.回溯法

 

用三个map分别记录每一列,没一正斜线和每一反斜线中是否有1  columnMap[int]byte,flag1Map[int]byte,flag2Map[int]byte

由于矩阵为n*n所以 在同一正斜线上的坐标满足 i+j=c(c为定值) 在同一反斜线上的坐标满足i-j=m(m为定值)

所以 columnMap的key为列数j

        正斜线flag1Map的key为 i+j

   反斜线flag2Map的key为i-j

func totalNQueens(n int) int {
    columnMap:=map[int]byte{}
    diag1Map:=map[int]byte{}
    diag2Map:=map[int]byte{}
    return dfs(0,0,n,columnMap,diag1Map,diag2Map)
}

func dfs(row,count,n int,columnMap,diag1Map,diag2Map map[int]byte)int{
    for col:=0;col<n;col++{
        if _,ok:=columnMap[col];ok{
            continue
        }
       
        if _,ok:=diag1Map[row-col];ok{
            continue
        }
       
        if _,ok:=diag2Map[row+col];ok{
            continue
        }
       
        
        if row==n-1{
            count++
        }else{
             columnMap[col]=0
             diag1Map[row-col]=0
             diag2Map[row+col]=0
            count=dfs(row+1,count,n,columnMap,diag1Map,diag2Map)
            delete(columnMap,col)
            delete(diag1Map,row-col)
            delete(diag2Map,row+col)
        }
    }
    return count
}

 

以上是关于n皇后问题的主要内容,如果未能解决你的问题,请参考以下文章

51. N 皇后

51. N 皇后

51. N 皇后

N皇后问题—初级回溯

八皇后问题求解的C语言程序的实现

N皇后问题