鱼C论坛

 找回密码
 立即注册
查看: 2537|回复: 23

[已解决]Python:每日一题 302

[复制链接]
发表于 2020-1-7 22:03:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
今天的题目:


给定一个矩阵,仅包含 'X' 和 'O',找到所有被 'X' 围绕的区域,并用 'X' 替换被围绕的所有的 'O'。

示例 1:

输入:
[
  ['X', 'X', 'X', 'X'],
  ['X', 'O', 'O', 'X'],
  ['X', 'X', 'O', 'X'],
  ['X', 'O', 'X', 'X'],
]
输出:
[
  ['X', 'X', 'X', 'X'],
  ['X', 'X', 'X', 'X'],
  ['X', 'X', 'X', 'X'],
  ['X', 'O', 'X', 'X'],
]
示例 2:

输入:
[
  ['X', 'X', 'X', 'X'],
  ['X', 'O', 'O', 'X'],
  ['X', 'O', 'O', 'X'],
  ['X', 'O', 'X', 'X'],
]
输出:
[
  ['X', 'X', 'X', 'X'],
  ['X', 'O', 'O', 'X'],
  ['X', 'O', 'O', 'X'],
  ['X', 'O', 'X', 'X'],
]


欢迎大家一起答题!
最佳答案
2020-1-8 15:26:47
本帖最后由 TJBEST 于 2020-1-8 20:53 编辑

题主改完了,你给测个数吧
  1. def fun302(grid):
  2.     if grid == [] :
  3.          return []
  4.     def find_O_side(x,y,where):
  5.         if grid[x][y] == 'X':
  6.             pass
  7.         elif (x,y) in O_side:
  8.             pass
  9.         else:
  10.             O_side.append((x,y))
  11.             if 'left' not in where:
  12.                 if y > 0:
  13.                     find_O_side(x,y - 1,['right'])
  14.             if 'right' not in where:
  15.                 if y < n - 1:
  16.                     find_O_side(x,y + 1,['left'])
  17.             if 'up' not in where:
  18.                if x > 0:
  19.                     find_O_side(x - 1,y,['bottom'])
  20.             if 'bottom' not in where:
  21.                if x < m - 1:
  22.                     find_O_side(x + 1,y,['up'])
  23.     O_side = []#记录所有最后还是O的点
  24.     m = len(grid)
  25.     n = len(grid[0])
  26.     #左侧
  27.     find_O_side(0,0,['left','up'])
  28.     for i in range(1,m - 1):
  29.         find_O_side(i,0,['left'])
  30.     #底层
  31.     find_O_side(m - 1,0,['left','bottom'])
  32.     for i in range(1,n - 1):
  33.         find_O_side(m - 1,i,['bottom'])
  34.     #右侧
  35.     find_O_side(m - 1,n - 1,['right','bottom'])
  36.     for i in range(1,m - 1):
  37.         find_O_side(i,n - 1,['right'])
  38.     #顶层
  39.     find_O_side(0,n - 1,['right','up'])
  40.     for i in range(1,n - 1):
  41.         find_O_side(0,i,['up'])
  42.     res = [['X'for i in range(0,n)]for j in range(0,m)]#二维数组的问题 建立时注意引用关系
  43.     for each in O_side:
  44.         res[each[0]][each[1]] = 'O'
  45.     return res
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-7 22:34:19 | 显示全部楼层
本帖最后由 阴阳神万物主 于 2020-1-8 04:06 编辑

下围棋?
我已经不考虑效率哒!
  1. def solve(face:'list 棋盘'):
  2.     class Point:
  3.         def __init__(self,pos:tuple,side:int):
  4.             self.x,self.y = pos
  5.             self.side = side
  6.     def cycle(x,y):#从O看
  7.         c = [Point((x,y-1),0)]
  8.         #print('调试',x,y)
  9.         try:
  10.             while c:#并非全气
  11.                 now = c[-1]
  12.                 #从已知方向探寻
  13.                 for i in range(7):
  14.                     index = (i+now.side)%8
  15.                     x,y = now.x+sides[index][0],now.y+sides[index][1]
  16.                     if x<0 or y<0:#过界了
  17.                         return []
  18.                     elif x==c[0].x and y<c[0].y:#圈反了,要顺时针圈
  19.                         return []
  20.                     if face[x][y] == 'X':
  21.                         c.append(Point((x,y),(index-1 if index%2 else index-2)))
  22.                         break
  23.                 else:
  24.                     return []
  25.                 if (c[0].x,c[0].y)==(c[-1].x,c[-1].y):
  26.                     if c[0].side != c[-1].side:#折返到头了
  27.                         return []
  28.                     break
  29.         except IndexError:#在边上,必然不会围上
  30.             return []
  31.         #print('调试',len(c))
  32.         return c
  33.     sides = ((-1,1),(-1,0),(-1,-1),(0,-1),(1,-1),(1,0),(1,1),(0,1))
  34.     for x in range(len(face)):
  35.         for y in range(1,len(face[x])):
  36.             if face[x][y]=='O' and face[x][y-1]=='X' and ('X'in face[x][y:]):#西方无气
  37.                 for each in cycle(x,y):#有围
  38.                     index = (each.side-1)%8
  39.                     #print('调试',each.x,each.y,index)
  40.                     nx,ny = each.x+sides[index][0],each.y+sides[index][1]
  41.                     while face[nx][ny] == 'O':
  42.                         #print('调试',nx,ny,index)
  43.                         face[nx][ny] = 'X'
  44.                         nx,ny = nx+sides[index][0],ny+sides[index][1]
  45.     return face
复制代码

结果应该没问题。
如下玩法都没玩脱
  1. >>> for line in solve([
  2.     ['O', 'O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'],
  3.     ['O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'],
  4.     ['X', 'O', 'X', 'X', 'O', 'X', 'O', 'O', 'O', 'O'],
  5.     ['X', 'O', 'X', 'O', 'X', 'O', 'X', 'O', 'O', 'O'],
  6.     ['X', 'O', 'X', 'O', 'X', 'O', 'X', 'O', 'O', 'X'],
  7.     ['O', 'O', 'X', 'O', 'O', 'O', 'X', 'O', 'X', 'O'],
  8.     ['O', 'O', 'O', 'X', 'O', 'X', 'O', 'O', 'O', 'X'],
  9.     ['O', 'O', 'O', 'O', 'X', 'O', 'O', 'O', 'O', 'O'],
  10.     ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'],
  11.     ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
  12.     ]):
  13.     print(line)

  14.    
  15. ['O', 'O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
  16. ['O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
  17. ['X', 'O', 'X', 'X', 'O', 'X', 'O', 'O', 'O', 'O']
  18. ['X', 'O', 'X', 'X', 'X', 'X', 'X', 'O', 'O', 'O']
  19. ['X', 'O', 'X', 'X', 'X', 'X', 'X', 'O', 'O', 'X']
  20. ['O', 'O', 'X', 'X', 'X', 'X', 'X', 'O', 'X', 'O']
  21. ['O', 'O', 'O', 'X', 'X', 'X', 'O', 'O', 'O', 'X']
  22. ['O', 'O', 'O', 'O', 'X', 'O', 'O', 'O', 'O', 'O']
  23. ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
  24. ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
  25. >>>
复制代码



评分

参与人数 1荣誉 +7 鱼币 +7 收起 理由
zltzlt + 7 + 7 1283 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-7 23:45:19 | 显示全部楼层
本帖最后由 Stubborn 于 2020-1-8 02:45 编辑

这让我学习过的一个数据结构:并查集  查一个点,到另外一个点,是否有联系。
勉强通过,虽然速度慢了点, def gang(coordinate):  检查连通性,可以优化, ,不过还是算了吧

  1. # -*- coding: utf-8 -*-
  2. # !/usr/bin/python3
  3. """
  4. @ Version : ??
  5. @ Author : Alex
  6. @ Software : Pycharm
  7. @ Time : 2020/1/2 下午2:20
  8. """

  9. from typing import List


  10. def union(array: List[List[str]]) -> List[List[str]]:
  11.     """
  12.     首先说下,并查集解决的问题,假设有这样的数据 1->2-3  4->5->6
  13.            1和3是有关系的吗? 是的
  14.            1和4是有关系的吗? 不是

  15.     所以我们的思路是把所有边界上的O看做一个连通区域。
  16.         遇到O就执行并查集合并操作,这样所有的O就会被分成两类
  17.             和边界上的O在一个连通区域内的。这些O我们保留。
  18.             不和边界上的O在一个连通区域内的。这些O就是被包围的,替换
  19.     """
  20.     row = len(array)
  21.     col = len(array[0])
  22.     # 这里是链接池,和外围有关系的家伙都被加进这里啦
  23.     unions = []
  24.     ret = [['X'] * col for _ in range(row)]

  25.     def enclosure(array):
  26.         """圈地,看下外围有多少‘O’,进而往内部搜索"""
  27.         r = []
  28.         l = len(array) - 1
  29.         s = len(array[0]) - 1
  30.         for i, v in enumerate(array[0]):
  31.             if v == "O":
  32.                 r.append((0, i))
  33.         for i, v in enumerate(array[-1]):
  34.             if v == "O":
  35.                 r.append((l, i))
  36.         for i, v in enumerate(array[1:-1]):
  37.             if v[0] == "O":
  38.                 r.append((i + 1, 0))
  39.             if v[-1] == "O":
  40.                 r.append((i + 1, s))
  41.         return r

  42.     def gang(coordinate):
  43.         """看看刁民(coordinate),有没有团伙"""
  44.         res = []
  45.         r, c = coordinate
  46.         if 0 < r < row - 1:
  47.             if array[r + 1][c] == "O":
  48.                 res.append((r + 1, c))
  49.             if array[r - 1][c] == "O":
  50.                 res.append((r - 1, c))
  51.         elif r == 0:  # 只能向下扩展,
  52.             if array[r + 1][c] == "O":
  53.                 res.append((r + 1, c))
  54.         elif r == row - 1:  # 只能向上扩展
  55.             if array[r - 1][c] == "O":
  56.                 res.append((r - 1, c))

  57.         if 0 < c < col - 1:
  58.             if array[r][c + 1] == "O":
  59.                 res.append((r, c + 1))
  60.             if array[r][c - 1] == "O":
  61.                 res.append((r, c - 1))
  62.         if c == 0:  # 只能向右扩展,
  63.             if array[r][c + 1] == "O":
  64.                 res.append((r, c + 1))
  65.         elif c == col - 1:  # 只能向左扩展
  66.             if array[r][c - 1] == "O":
  67.                 res.append((r, c - 1))
  68.         new = []
  69.         for i in res:
  70.             if i not in unions:
  71.                 new.append(i)
  72.         return new

  73.     # 这是我们初始的刁民,开始往里面圈地了
  74.     temporary_union = enclosure(array)

  75.     while temporary_union:
  76.         unions.append(temporary_union[-1])
  77.         O = temporary_union.pop()
  78.         temporary_union += gang(O)

  79.     for x, y in unions:
  80.         ret[x][y] = "O"
  81.    
  82.     return ret
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-7 23:50:27 | 显示全部楼层
本帖最后由 Croper 于 2020-1-7 23:58 编辑

继续炸岛喽,今天只炸一圈
  1. def func302(grid)->int:
  2.     if len(grid)==0 or len(grid[0])==0:
  3.         return grid

  4.     width=len(grid[0])
  5.     height=len(grid)

  6.     ret=[['X']*width for _ in range(height)]


  7.     #把岛,哦不,把白棋吃掉
  8.     def burnisland(i,j):
  9.         if i<0 or i>=height or j<0 or j>=width:
  10.             return
  11.         if grid[i][j]=='X':
  12.             return
  13.         grid[i][j]='X'
  14.         ret[i][j]='O'
  15.         burnisland(i+1,j)
  16.         burnisland(i-1,j)
  17.         burnisland(i,j+1)
  18.         burnisland(i,j-1)

  19.    #遇到一个岛(划去)吃一片白棋
  20.     for i in range(height):
  21.         for j in range(width):
  22.             if (0<i<height-1 and 0<j<width-1) or grid[i][j]=='X':
  23.                 continue
  24.             burnisland(i,j)
  25.     return ret
复制代码

评分

参与人数 1荣誉 +7 鱼币 +7 收起 理由
zltzlt + 7 + 7 1265 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-1-8 00:10:38 | 显示全部楼层
Croper 发表于 2020-1-7 23:50
继续炸岛喽,今天只炸一圈
  1. >>> func302([
  2.         ['X','O','X','X'],
  3.         ['X','X','O','X'],
  4.         ['X','O','O','X'],
  5.         ['X','O','O','O']
  6.         ])
  7. Traceback (most recent call last):
  8.   File "<pyshell#8>", line 5, in <module>
  9.     ['X','O','O','O']
  10.   File "<pyshell#1>", line 8, in func302
  11.     ret=[['X']*width for _ in height]
  12. TypeError: 'int' object is not iterable
  13. >>>
复制代码

你没调试过吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 00:17:14 | 显示全部楼层

不好意思,最先改了点就发上来了。。。

没到一分钟我就删了没想到还是被你复制下来了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 01:09:13 | 显示全部楼层
本帖最后由 hrp 于 2020-1-8 19:55 编辑

乱七八糟
  1. def func302(m):
  2.     if (not m) or (not m[0]):
  3.         return m
  4.     om, xm, flag = set(), set(), 1
  5.     line, row = len(m), len(m[0])
  6.     def find(i, j):
  7.         nonlocal flag
  8.         if not (i, j) in xm:
  9.             if flag:
  10.                 if (m[i][j] == 'O') and (i in range(1, line-1)) and (j in range(1, row-1)):
  11.                     temp = (i, j-1), (i-1, j), (i, j+1), (i+1, j)
  12.                     if not False in ((m[p][q] == 'X') or ((p, q) in om) for p, q in temp):
  13.                         for k, l in om:
  14.                             m[k][l] = 'X'
  15.                     else:
  16.                         for p, q in temp:
  17.                             if (m[p][q] == 'O') and (not (p, q) in om):
  18.                                 om.add((p, q))
  19.                                 find(p, q)
  20.                             elif (m[p][q] == 'X') and (not (p, q) in xm):
  21.                                 xm.add((p, q))
  22.                 elif ((not (i in range(1, line-1))) or (not (j in range(1, row-1)))) and (m[i][j] == 'O'):
  23.                     flag = 0

  24.     for i in range(1, line-1):
  25.         for j in range(1, row-1):
  26.             if m[i][j] == 'X':
  27.                 if not (i, j) in xm:
  28.                     xm.add((i, j))
  29.             else:
  30.                 if not (i, j) in om:
  31.                     om.add((i, j))
  32.                     find(i, j)
  33.     return m
复制代码

评分

参与人数 1荣誉 +4 鱼币 +4 收起 理由
zltzlt + 4 + 4

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 11:58:54 | 显示全部楼层
Croper 发表于 2020-1-7 23:50
继续炸岛喽,今天只炸一圈

def burnisland(i,j):
        if i<0 or i>=height or j<0 or j>=width:
            return
        if grid[j]=='X':
            return
        grid[j]='X'
        ret[j]='O'
        burnisland(i+1,j)
        burnisland(i-1,j)
        burnisland(i,j+1)
        burnisland(i,j-1)
新手求教,能不能解释这段代码是怎么执行的?
字面上看是把grid中的'0'赋值给了ret
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 13:49:45 | 显示全部楼层
kinkon 发表于 2020-1-8 11:58
def burnisland(i,j):
        if i=height or j=width:
            return

把周围一圈(以及与其相邻的)‘O’赋值给ret,
不相邻的‘O’当然是被围死了啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2020-1-8 14:31:58 | 显示全部楼层
本帖最后由 kinkon 于 2020-1-8 15:16 编辑
Croper 发表于 2020-1-8 13:49
把周围一圈(以及与其相邻的)‘O’赋值给ret,
不相邻的‘O’当然是被围死了啊


谢谢,函数这里明白了,不理解的应该是在for循环里。4行4列的循环后为什么会变成10行10列了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 15:26:47 | 显示全部楼层    本楼为最佳答案   
本帖最后由 TJBEST 于 2020-1-8 20:53 编辑

题主改完了,你给测个数吧
  1. def fun302(grid):
  2.     if grid == [] :
  3.          return []
  4.     def find_O_side(x,y,where):
  5.         if grid[x][y] == 'X':
  6.             pass
  7.         elif (x,y) in O_side:
  8.             pass
  9.         else:
  10.             O_side.append((x,y))
  11.             if 'left' not in where:
  12.                 if y > 0:
  13.                     find_O_side(x,y - 1,['right'])
  14.             if 'right' not in where:
  15.                 if y < n - 1:
  16.                     find_O_side(x,y + 1,['left'])
  17.             if 'up' not in where:
  18.                if x > 0:
  19.                     find_O_side(x - 1,y,['bottom'])
  20.             if 'bottom' not in where:
  21.                if x < m - 1:
  22.                     find_O_side(x + 1,y,['up'])
  23.     O_side = []#记录所有最后还是O的点
  24.     m = len(grid)
  25.     n = len(grid[0])
  26.     #左侧
  27.     find_O_side(0,0,['left','up'])
  28.     for i in range(1,m - 1):
  29.         find_O_side(i,0,['left'])
  30.     #底层
  31.     find_O_side(m - 1,0,['left','bottom'])
  32.     for i in range(1,n - 1):
  33.         find_O_side(m - 1,i,['bottom'])
  34.     #右侧
  35.     find_O_side(m - 1,n - 1,['right','bottom'])
  36.     for i in range(1,m - 1):
  37.         find_O_side(i,n - 1,['right'])
  38.     #顶层
  39.     find_O_side(0,n - 1,['right','up'])
  40.     for i in range(1,n - 1):
  41.         find_O_side(0,i,['up'])
  42.     res = [['X'for i in range(0,n)]for j in range(0,m)]#二维数组的问题 建立时注意引用关系
  43.     for each in O_side:
  44.         res[each[0]][each[1]] = 'O'
  45.     return res
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 15:45:47 | 显示全部楼层
  1. def fun302(matrix):

  2.     def near_check(matrix,x,y):
  3.         near = [i for i in [[x-1,y],[x+1,y],[x,y-1],[x,y+1]] if 0 <= i[0] <= len(matrix)-1 and 0 <= i[1] <= len(matrix[x])-1]
  4.         return [i for i in near if matrix[i[0]][i[1]] == 'O']
  5.         
  6.     O_zone,nearby,nearby_2 = [],[],[]
  7.     for i in range(len(matrix)):
  8.         if matrix[0][i] == 'O':
  9.             O_zone.append([0,i])
  10.             if near_check(matrix,0,i):
  11.                 nearby = near_check(matrix,0,i)
  12.                 while True:
  13.                     O_zone.extend(nearby)
  14.                     for j in nearby:
  15.                         for n in near_check(matrix,j[0],j[1]):
  16.                             if n not in O_zone:
  17.                                 nearby_2.append(n)
  18.                     if not nearby_2:
  19.                         break
  20.                     nearby,nearby_2 = nearby_2,[]
  21.         if matrix[len(matrix)-1][i] == 'O' and [len(matrix)-1,i] not in O_zone:
  22.             O_zone.append([len(matrix)-1,i])
  23.             if near_check(matrix,len(matrix)-1,i):
  24.                 nearby = near_check(matrix,len(matrix)-1,i)
  25.                 while True:
  26.                     O_zone.extend(nearby)
  27.                     for j in nearby:
  28.                         for n in near_check(matrix,j[0],j[1]):
  29.                             if n not in O_zone:
  30.                                 nearby_2.append(n)
  31.                     if not nearby_2:
  32.                         break
  33.                     nearby,nearby_2 = nearby_2,[]
  34.     for i in range(len(matrix[0])):
  35.         if matrix[i][0] == 'O' and [i,0] not in O_zone:
  36.             O_zone.append([i,0])
  37.             if near_check(matrix,i,0):
  38.                 nearby = near_check(matrix,i,0)
  39.                 while True:
  40.                     O_zone.extend(nearby)
  41.                     for j in nearby:
  42.                         for n in near_check(matrix,j[0],j[1]):
  43.                             if n not in O_zone:
  44.                                 nearby_2.append(n)
  45.                     if not nearby_2:
  46.                         break
  47.                     nearby,nearby_2 = nearby_2,[]
  48.         if matrix[i][len(matrix[0])-1] == 'O' and [i,len(matrix[0])-1] not in O_zone:
  49.             O_zone.append([i,len(matrix[0])-1])
  50.             if near_check(matrix,i,len(matrix[0])-1):
  51.                 nearby = near_check(matrix,i,len(matrix[0])-1)
  52.                 while True:
  53.                     O_zone.extend(nearby)
  54.                     for j in nearby:
  55.                         for n in near_check(matrix,j[0],j[1]):
  56.                             if n not in O_zone:
  57.                                 nearby_2.append(n)
  58.                     if not nearby_2:
  59.                         break
  60.                     nearby,nearby_2 = nearby_2,[]
  61.     for i in range(len(matrix)):
  62.         for j in range(len(matrix[i])):
  63.             if matrix[i][j] == 'O' and [i,j] not in O_zone:
  64.                 matrix[i][j] = 'X'
  65.     return matrix
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 收起 理由
zltzlt + 3 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 18:13:44 | 显示全部楼层
TJBEST 发表于 2020-1-8 15:26
我又来了,超长代码你值得拥有。话说最近版主出题越来越难了

一直都是普通偏简单的难度,不同类的题型已经出得差不多了,版主大大还没有江郎才尽,已然是难能可贵。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-8 20:20:04 | 显示全部楼层

解答错误

输入:[['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'O', 'O', 'X'], ['X', 'X', 'O', 'X', 'X'], ['X', 'X', 'O', 'X', 'X']]
输出:[['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'O', 'X', 'X'], ['X', 'X', 'O', 'X', 'X']]
预期结果:[['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'X', 'X', 'X'], ['X', 'X', 'O', 'O', 'X'], ['X', 'X', 'O', 'X', 'X'], ['X', 'X', 'O', 'X', 'X']]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-8 20:23:55 | 显示全部楼层
Stubborn 发表于 2020-1-7 23:45
这让我学习过的一个数据结构:并查集  查一个点,到另外一个点,是否有联系。,
勉强通过,虽然 ...

输入空矩阵 [] 报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-8 20:24:51 | 显示全部楼层
TJBEST 发表于 2020-1-8 15:26
我又来了,超长代码你值得拥有。话说最近版主出题越来越难了

输入空矩阵 [] 报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-8 20:26:18 | 显示全部楼层

输入空矩阵 [] 报错。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 20:40:40 | 显示全部楼层
Stubborn 发表于 2020-1-7 23:45
这让我学习过的一个数据结构:并查集  查一个点,到另外一个点,是否有联系。,
勉强通过,虽然 ...

并查集求动态问题比较好使一点。。
比如棋一直在下,然后求每一步的死活什么的。。

这里用这个有点杀鸡用牛刀的意思了- -
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 20:51:58 | 显示全部楼层
  1. def f302(M):
  2.     J=len(M[0])
  3.     I=len(M)
  4.     if {0,1,2}&{J,I}:
  5.         return M
  6.     res=[['X']*J for _ in range(I)]

  7.     def dp(i,j):
  8.         if i in range(I) and j in range(J) and M[i][j]=='O':
  9.             res[i][j]='O'
  10.             M[i][j]='X'
  11.             dp(i+1,j)
  12.             dp(i-1,j)
  13.             dp(i,j+1)
  14.             dp(i,j-1)

  15.     for i in range(I):
  16.         dp(i,0)
  17.         dp(i,J-1)
  18.     for j in range(J):
  19.         dp(0,j)
  20.         dp(I-1,j)
  21.     return res
复制代码


来晚了,瞟了眼,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-8 20:54:45 | 显示全部楼层
题主改完了,你给测个速度吧

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
zltzlt + 5 + 5 1229 ms

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 22:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表