Tents and Trees feasibility
Python 3.8 (pre-release), 253 244 bytes

from itertools import*
f=lambda b,h,w:all(set(t:=[i%w+i//w*1jfor i,e in enumerate(b)if e])&amp;set(s:=[*map(sum,zip(t,T))])or~any(abs(a-b)&lt;2for a,b in combinations(s,2))+all(h&gt;a.imag&gt;-1&lt;a.real&lt;w for a in s)for T in product(*[[1,1j,-1,-1j]]*sum(b)))

Try it online!
-6 bytes thanks to @user202729 (chain comparisons)
-3 bytes thanks to @ovs (1jfor; …or a+1^b → …or~a+b for &quot;implies&quot; boolean operator)
# Itertools for combinations and product
from itertools import*
f=lambda b,h,w: all(
    # Test if a given set of tent position deltas works:
    # Positions are complex numbers: real part increasing to the right, imaginary part increasing down
    # (De Morgan shortened, so many expressions negated)
        # No tree is on a tent:
            # t:=Tree positions (1s)
            set(t:=[i%w+i//w*1j for i,e in enumerate(b)if e])
            # s:=Tent positions as sum of tree positions and deltas
            &amp; set(s:=[*map(sum,zip(t,T))])
        # and difference between all distinct pairs oftrees is at least 2:
            or any(abs(a-b)&lt;2for a,b in combinations(s,2))
        # and all trees are within rectangular boundary
            # (Using Python 2's quirky complex floordiv doesn't work since those return complex nums,
            # which don't have a total order.
            # Plus Python 38 has saves so much here; using 2 would be a waste anyway)
            &gt;= all(h &gt; a.imag &gt; -1 &lt; a.real &lt; w for a in s)
    # For each possible delta (four directions, distance 1)
    # sum(b) is the number of tents since each tent contributes 1
    for T in product(*[[1,1j,-1,-1j]]*sum(b))
)