Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python
- # coding: utf-8
- # In[9]:
- def find(s, a):
- i = a
- while s[i] >= 0:
- i = s[i]
- return i
- # In[10]:
- def union(s, a, b):
- pa = find(s, a)
- pb = find(s, b)
- if pa == pb: return
- if s[pa] <= s[pb]:
- s[pa] += s[pb]
- s[pb] = pa
- elif s[pb] < s[pa]:
- s[pb] += s[pa]
- s[pa] = pb
- # In[11]:
- def makeDS(tab, piece):
- def ij2i(i, j):
- return i*n + j
- def checkVecinos(i, j):
- def check1Vecino(i0, j0):
- if i0 < 0 or i0 >= n or j0 < 0 or j0 >= n: return
- if tab[i0][j0] == piece:
- I = ij2i(i, j)
- I0 = ij2i(i0, j0)
- union(ds, I, I0)
- check1Vecino(i - 1, j)
- check1Vecino(i - 1, j + 1)
- check1Vecino(i, j - 1)
- check1Vecino(i, j + 1)
- check1Vecino(i + 1, j - 1)
- check1Vecino(i + 1, j)
- n = len(tab)
- ds = [-1]*(n*n)
- for i in range(n):
- for j in range(n):
- if tab[i][j] == piece:
- checkVecinos(i, j)
- return ds
- # In[19]:
- tab = [[1, 1, 0],
- [0, 1, 1],
- [0, 0, 1]]
- print(makeDS(tab, 1))
- # In[14]:
- def findWinner(tab, ds):
- n = len(tab)
- def ij2i(i, j):
- return i*n + j
- for i in range(n):
- Ii = ij2i(0, i)
- for j in range(n):
- If = ij2i(n-1, j)
- if find(ds, Ii) == find(ds, If):
- return "Winner!"
- return ":("
- # In[20]:
- ds = makeDS(tab, 1)
- findWinner(tab, ds)
- # In[22]:
- import graphviz as gv
- # In[23]:
- def makeDot(a):
- nodes = '\n '.join(['%d;'%(i)
- for i in range(len(a))])
- edges = '\n '.join(['%d %d;'%(i, a[i])
- for i in range(len(a))
- if a[i] >= 0])
- dot = """
- digraph "test" {
- rankdir = BT;
- %s
- %s
- }
- """%(nodes, edges)
- return dot
- # In[ ]:
- gv.Source(makeDot(ds))
- # In[ ]:
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement