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'的数字字符串,每个数字代表一个字母,请返回其所有可能的字母组合。

下图的手机按键图,就表示了每个数字可以代表的字母。

12
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空间消耗比较大,建议少用。

posted @   bonelee  阅读(536)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2016-10-20 用 Spark 为 Elasticsearch 导入搜索数据
点击右上角即可分享
微信分享提示