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
}
原文地址:https://www.cnblogs.com/fwdqxl/p/8279305.html