## Python3, 285 bytes Similar to the other solutions, the code below builds haystacks by first anchoring the search on each needle present in the input. ```lang-py E=enumerate def G(x,y,d): q,s=[(x,y)],[(x,y)] for x,y in q: t=[u for X,Y in[(1,0),(-1,0),(0,1),(0,-1)]if d.get(u:=(x+X,y+Y))and u not in s and'#'==d[u]] q+=t;s+=t return s def f(b): d={(x,y):v for x,r in E(b)for y,v in E(r)} return max([G(*i,d)for i in d if'N'==d[i]],key=len) ``` [Try it online!](https://tio.run/##hVLBjtsgED2XrxiFA5CQKN5kpSoVx9XeOO/KtVa2jLtsE@wAXsWq@u0pYCdbbSvlYGDevJl58NwN/rU1m6@dPZ8fhDL9QdnSK1SrBh7piQ@8ZjsER@5EHkNW8GlH0LQWwhG0gWPggBd5n8An/hzAnGZ8zThdjtuaZ2ldZqzQDdSrH8rTfifoafHEh8UzY6WpoQfT@tjRQQgJJkLUeV@EaXBcCP/NhQWBVb63gZNkNrSKEmvxKwnbvU/CbGzzEJIxHPj7GFr2@1p/KE80f6RzHS4ZSTpSatANkWmuLgr@Uw1irww7uwwEzGYzJDFGUmKEpQwfRhFzd1MSxySWgSDTOWLIbT5KcSpK5XEdkZG1vbLkBwvHcReuvHLvL1wZZUiZ5skoa0RiLj6Ob1@qtrQ1deGNvkz3zvO5LuB640bvvbJUtkZxcCvX7bWn5LshLLicutQ6gOXw4tp973VrUjeogoa/@qPgmUhuoM8OxL/jkwsRCi@dLLtYvqvyU5EPhSBAEHRWm1HH6q3Vhh7KjpLxzCvGWJD2j6yMoalsSebbNfsP5e42ZXObsr1NuWfnPw) ## Python3, 559 bytes Out of academic curiosity, the solution below finds all possible haystacks with a needle, and then selects the largest. This approach is exactly the opposite of the code above and the other answers. ```lang-py E=enumerate def f(b): d,P={(x,y):v for x,r in E(b)for y,v in E(r)},[] q=[([t:=[i for i in d if'#'==d[i]][0]],[t],[],0)] for s,S,g,c in q: if[]==s: if[]==(k:=[i for i in d if i not in[J for K in g+[S]for J in K]and'#'==d[i]]):P+=g+[S] if k:q+=[(k[:1],k[:1],g+[S],0)] continue (x,y),*s=s L=[[],[]] for X,Y in[(1,0),(-1,0),(0,1),(0,-1)]: if d.get(u:=(x+X,y+Y))and u not in S:L[d[u]=='#']+=[u] for i in L[0]*(0==c):q+=[(s+L[1]+[i],S+L[1]+[i],g,1)] q+=[(s+L[1],S+L[1],g,c)] return max([i for i in P if any(d[j]=='N'for j in i)],key=len) ``` [Try it online!](https://tio.run/##hVNNb@IwED1vfoVFDrGJi0hLpVUkH3tpkYXEpZVrVYEE1nw4NE4qotX@dnbGCQVtV@ohZmbeG8@bYXxo61@lvft5qE6nB1HYZl9UWV0EebEiK7pgaUByPhO/6ZG3LP0gq7IiR14RY8kDwOi2/KNzK/aHKx2Qd6GoqlOhjKcbRHNiVlEYCZEro7Uaa81VDZ/mYwYpyHN8ztd8iex3KAsJSgvh0Oxtuv16KVi2rMFTjx54QmAdq7lG7xG9J53Z/FKcpbNYeEZ3M9mm7zFI3qo00bw7PdxJI2RZ2trYpgDbj4EPnXDgTIVS2AKSsNgzf0EdNIFETm@6nzFP/HmTMN23QvLRuqhpkwp6jJ95G78wBgpJ03dC5ulU5aqBjkG1Bm3NuYRvewrjG9KxEEvWKXfxVCU6hub4/GKuoTLmXVF6GMeMUFXUTWXJPjvS67HOUGNmW5qrDWqQEUIbhAyDCRWt2BWWnVxCBBkMBoEMw0DKMAilhC8MMOZuezBEMJRAkN7GWODuLqmhT/LpeHaRjjX5ZMkLK8RyZ6785N6fuRJlSOnrSZTVRRDDra7Lt0WZVTl1sNw/@hEoNTT6MoGV2dVFRWVpC07cyB12pqbRq40YjM3fkhsIZu2bK3dNbUrrbyML0HB1f0AcBPAZBf8@nLT/Q68eT78dfsX6RXDpQh21arWISBSQQ2Vsp2O0KY2l@@xAo87mC8YYSPsiK2FBn3YTDSdj9h/K7feUu@8pk@8p9@z0Fw)