dfs 解决八皇后问题 以及其他图搜索问题
33. N皇后问题
中文
English
n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击(任意两个皇后不能位于同一行,同一列,同一斜线)。
给定一个整数n,返回所有不同的n皇后问题的解决方案。
每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。
样例
例1:
输入:1
输出:
[["Q"]]
例2:
输入:4
输出:
[
// Solution 1
[".Q..",
"...Q",
"Q...",
"..Q."
],
// Solution 2
["..Q.",
"Q...",
"...Q",
".Q.."
]
]
挑战
你能否不使用递归完成?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | class Solution: """ @param: n: The number of queens @return: All distinct solutions """ def solveNQueens( self , n): # write your code here self .result = [] self .position = [ - 1 ] * n self .dfs(n, start_index = 0 ) return self .result def to_chars( self , position): ans = [] n = len (position) for i in range ( 0 , n): row = [ '.' ] * n row[position[i]] = 'Q' ans.append("".join(row)) return ans def is_valid_pos( self , position, start_index, k): for i in range (start_index): if position[i] > = 0 and (position[i] = = k or \ abs (start_index - i) = = abs (k - position[i])): return False return True def dfs( self , n, start_index): if start_index = = n: self .result.append( self .to_chars( self .position)) return for i in range ( 0 , n): if start_index < n and self .is_valid_pos( self .position, start_index, i): self .position[start_index] = i self .dfs(n, start_index + 1 ) self .position[start_index] = - 1 |
这种题目写起来真的是比较繁琐。
425. 电话号码的字母组合
中文
English
给一个不包含'0'
和'1'
的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。
下图的手机按键图,就表示了每个数字可以代表的字母。
1 | 2 ABC | 3 DEF |
---|---|---|
4 GHI |
5 JKL |
6 MNO |
7 PQRS |
8 TUV |
9 WXYZ |
样例
样例 1:
输入: "23"
输出: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
解释:
'2' 可以是 'a', 'b' 或 'c'
'3' 可以是 'd', 'e' 或 'f'
样例 2:
输入: "5"
输出: ["j", "k", "l"]
注意事项
以上的答案是按照词典编撰顺序进行输出的,不过,在做本题时,你也可以任意选择你喜欢的输出顺序。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | class Solution: """ @param digits: A digital string @return: all posible letter combinations """ letter_map = { "2" : "abc" , "3" : "def" , "4" : "ghi" , "5" : "jkl" , "6" : "mno" , "7" : "pqrs" , "8" : "tuv" , "9" : "wxyz" } def letterCombinations( self , digits): # write your code here result = [] self .helper(digits, start_index = 0 , path = "", result = result) return result """ # Solution 2 if not digits: return [] if len(digits) == 1: return list(self.letter_map[digits[0]]) result = [] for c in self.letter_map[digits[0]]: combinations = self.letterCombinations(digits[1:]) for comb in combinations: result.append(c + comb) return result """ def helper( self , s, start_index, path, result): if start_index = = len (s): if path: result.append(path) return for c in self .letter_map[s[start_index]]: self .helper(s, start_index + 1 , path + c, result) |
两种解法自己选择一种即可。solution 2空间消耗比较大,建议少用。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2016-10-20 用 Spark 为 Elasticsearch 导入搜索数据