递归和回溯_leetcode130

#coding=utf-8
class Solution(object):
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""


# 思路 : step 1)从边界找所有0的floodfill区域,并标记为visited
# step 2)所有未被标记的0 置为 x

if not board:
return board

self.derection = [[-1,0],[0,1],[1,0],[0,-1]]

self.m = len(board)
self.n = len(board[0])

# self.m = 4
# self.n = 4


self.visit = [[False for i in range(self.n)] for i in range(self.m)]


for x in range(self.m):
for y in range(self.n):

if self.inBoundary(x,y) and not self.visit[x][y] and board[x][y] == "0":
self.dfs(board,x,y)


board = self.overTurn(board)
print board


def inArea(self,x,y):
return x >= 0 and x < self.m and y >= 0 and y < self.n

def inBoundary(self,x,y):

# self.m = 4
# self.n = 4

colFlag = False
rowFlag = False

if x in range(self.m):
colFlag = (y == 0 or y == self.n-1)

if y in range(self.n):
rowFlag = ( x == 0 or x == self.m-1)

return colFlag or rowFlag



def dfs(self,board,x,y):

self.visit[x][y] = True

for item in self.derection:
newX = x + item[0]
newY = y + item[1]

if self.inArea(newX,newY) and not self.visit[newX][newY] and board[x][y] == "0":
self.dfs(board,newX,newY)

return

def overTurn(self,board):
for x in range(self.m):
for y in range(self.n):
if board[x][y] == "0" and not self.visit[x][y]:
board[x][y] = "x"


# print board
return board



class Solution2(object):
def solve(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""


# 思路 : step 1)从边界找所有0的floodfill区域,并标记为visited
# step 2)所有未被标记的0 置为 x

if not board:
return board

# board[0][0] = "A"

print board

self.derection = [[-1,0],[0,1],[1,0],[0,-1]]

self.m = len(board)
self.n = len(board[0])


self.visit = [[False for i in range(self.n)] for i in range(self.m)]


for x in range(self.m): for y in range(self.n): if self.inBoundary(x,y) and not self.visit[x][y] and board[x][y] == "O": self.dfs(board,x,y) board = self.overTurn(board) # print board def inArea(self,x,y): return x >= 0 and x < self.m and y >= 0 and y < self.n def inBoundary(self,x,y): # self.m = 4 # self.n = 4 colFlag = False rowFlag = False if x in range(self.m): colFlag = (y == 0 or y == self.n-1) if y in range(self.n): rowFlag = ( x == 0 or x == self.m-1) return colFlag or rowFlag def dfs(self,board,x,y): self.visit[x][y] = True for item in self.derection: newX = x + item[0] newY = y + item[1] if self.inArea(newX,newY) and not self.visit[newX][newY] and board[x][y] == "O": self.dfs(board,newX,newY) return def overTurn(self,board): for x in range(self.m): for y in range(self.n): if board[x][y] == "O" and not self.visit[x][y]: board[x][y] = "X" # print board return boards = Solution2()s.solve([["X","X","X","X"],["X","O","O","X"],["X","X","O","X"],["X","O","X","X"]])
posted @ 2019-03-19 10:37  AceKo  阅读(207)  评论(0编辑  收藏  举报