问题描述(转换为矩阵形式):
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 }