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.."
]
]
挑战
你能否不使用递归完成?
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"]
注意事项
以上的答案是按照词典编撰顺序进行输出的,不过,在做本题时,你也可以任意选择你喜欢的输出顺序。
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空间消耗比较大,建议少用。

浙公网安备 33010602011771号