本帖最后由 阴阳神万物主 于 2020-1-8 04:06 编辑
下围棋?
我已经不考虑效率哒!
- def solve(face:'list 棋盘'):
- class Point:
- def __init__(self,pos:tuple,side:int):
- self.x,self.y = pos
- self.side = side
- def cycle(x,y):#从O看
- c = [Point((x,y-1),0)]
- #print('调试',x,y)
- try:
- while c:#并非全气
- now = c[-1]
- #从已知方向探寻
- for i in range(7):
- index = (i+now.side)%8
- x,y = now.x+sides[index][0],now.y+sides[index][1]
- if x<0 or y<0:#过界了
- return []
- elif x==c[0].x and y<c[0].y:#圈反了,要顺时针圈
- return []
- if face[x][y] == 'X':
- c.append(Point((x,y),(index-1 if index%2 else index-2)))
- break
- else:
- return []
- if (c[0].x,c[0].y)==(c[-1].x,c[-1].y):
- if c[0].side != c[-1].side:#折返到头了
- return []
- break
- except IndexError:#在边上,必然不会围上
- return []
- #print('调试',len(c))
- return c
- sides = ((-1,1),(-1,0),(-1,-1),(0,-1),(1,-1),(1,0),(1,1),(0,1))
- for x in range(len(face)):
- for y in range(1,len(face[x])):
- if face[x][y]=='O' and face[x][y-1]=='X' and ('X'in face[x][y:]):#西方无气
- for each in cycle(x,y):#有围
- index = (each.side-1)%8
- #print('调试',each.x,each.y,index)
- nx,ny = each.x+sides[index][0],each.y+sides[index][1]
- while face[nx][ny] == 'O':
- #print('调试',nx,ny,index)
- face[nx][ny] = 'X'
- nx,ny = nx+sides[index][0],ny+sides[index][1]
- return face
复制代码
结果应该没问题。
如下玩法都没玩脱
- >>> for line in solve([
- ['O', 'O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O'],
- ['O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'],
- ['X', 'O', 'X', 'X', 'O', 'X', 'O', 'O', 'O', 'O'],
- ['X', 'O', 'X', 'O', 'X', 'O', 'X', 'O', 'O', 'O'],
- ['X', 'O', 'X', 'O', 'X', 'O', 'X', 'O', 'O', 'X'],
- ['O', 'O', 'X', 'O', 'O', 'O', 'X', 'O', 'X', 'O'],
- ['O', 'O', 'O', 'X', 'O', 'X', 'O', 'O', 'O', 'X'],
- ['O', 'O', 'O', 'O', 'X', 'O', 'O', 'O', 'O', 'O'],
- ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O'],
- ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
- ]):
- print(line)
-
- ['O', 'O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
- ['O', 'X', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
- ['X', 'O', 'X', 'X', 'O', 'X', 'O', 'O', 'O', 'O']
- ['X', 'O', 'X', 'X', 'X', 'X', 'X', 'O', 'O', 'O']
- ['X', 'O', 'X', 'X', 'X', 'X', 'X', 'O', 'O', 'X']
- ['O', 'O', 'X', 'X', 'X', 'X', 'X', 'O', 'X', 'O']
- ['O', 'O', 'O', 'X', 'X', 'X', 'O', 'O', 'O', 'X']
- ['O', 'O', 'O', 'O', 'X', 'O', 'O', 'O', 'O', 'O']
- ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
- ['O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O', 'O']
- >>>
复制代码
|