想象一个二维的布尔值数组,0代表长方形土地上的草的正方形,1代表栅栏。
编写一个函数,该函数接受2D数组作为输入,并确定是否可以使用仅使用北/东/西/南移动从任何一个草区到任何其他草区的旅行,而不会碰到围栏。
如果数组中的任何区域被栅栏完全包围(意味着不能通过N/E/W/S来到达数组中的所有其他区域),则函数应该返回false;否则,它应该返回true。
下面是两个可以用作输入的示例数组,尽管您的函数不仅能够处理这些数组,还可以处理任意二维布尔值数组:
0 0 0 0 0
0 1 0 0 0
0 1 1 1 1
0 0 0 0 0
0 0 0 1 1
(should return true)
0 1 0 1 0
0 1 1 0 0
0 0 0 0 0
0 0 0 1 0
1 1 1 1 0
(should return false, since the middle 0 in the top row is fully enclosed)最短工作代码获胜。我会挑选获奖者后,要么一个星期已经过去,或没有新的提交在24小时内。
发布于 2014-01-06 19:12:12
input('');c=bwconncomp(~ans,4);c.NumObjects<2发布于 2014-01-02 14:40:56
{∧/,⊃{⍺∨⊖⍵}/{⍵∨(∧\~⍵)∨⌽∧\⌽~⍵}¨s,⊖¨s←⊂⍵}用法:
board1 board2
0 0 0 0 0 0 1 0 1 0
0 1 0 0 0 0 1 1 0 0
0 1 1 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 1 1 1 1 1 0
{∧/,⊃{⍺∨⊖⍵}/{⍵∨(∧\~⍵)∨⌽∧\⌽~⍵}¨s,⊖¨s←⊂⍵} ¨ board1 board2
1 0发布于 2014-01-02 20:53:56
当然不是最短的,但这是我第一次尝试,所以我为此感到骄傲:
def f(n):
m=[int(c) for c in n if c!='\n']
for i in range(len(m)):
if m[i]<1:m[i]=2;break
g(m,n.find('\n'),i);return not 0in m
def g(n,w,i):
for x in i-w,i-1,i+1,i+w:
if 0<=x<len(n):
if n[x]<1:n[x]=2;g(n,w,x)它的输入应该是0& 1s的字符串,其中行由换行符(\n)分隔。
示例用法:
>>> f("00000\n01000\n01111\n00000\n00011")
True
>>> f("01010\n01100\n00000\n00010\n11110")
Falsehttps://codegolf.stackexchange.com/questions/17196
复制相似问题