Seats in a Finnish cinema
JavaScript (ES6), 156 137 bytes
Saved 18 bytes thanks to @l4m2
That's quite a lot of map() ...

f=(a,n=1)=&gt;a.map(B=(r,y)=&gt;r.map((_,x)=&gt;a.map(b=q=&gt;q.map(v=&gt;b=b&lt;(d=X*X--+Y*Y)|!v?b:d,X=x)&amp;Y--,Y=y)|v|b&lt;=B||(R=r,C=x,B=b)))|B?f(a,R[C]=++n):a

Try it online!
Commented
f = (a, n = 1) =&gt;               // a = input array; n = seat counter
  a.map(B =                     // initialize B to a non-numeric value
    (r, y) =&gt;                   // for each row r at position y in a[]:
    r.map((_, x) =&gt;             //   for each target seat at position x in r[]:
      a.map(b =                 //     initialize b to a non-numeric value
        q =&gt;                    //     for each row q in a[]:
        q.map(v =&gt;              //       for each reference seat v in q[]:
          b = b &lt; (             //         if b is less than d, defined as
            d = X * X-- + Y * Y //           the square of the Euclidean distance
          ) | !v ?              //           or the reference seat is empty
            b                   //             let b unchanged
          :                     //           else:
            d,                  //             update b to d
          X = x                 //         start with X = x
        ) &amp; Y--,                //       end of q.map(); decrement Y
        Y = y                   //       start with Y = y
      ) |                       //     end of inner a.map()
      b &lt;= B ||                 //     unless b is less than or equal to B,
      (R = r, C = x, B = b)     //     update B to b and save this position in (R, C)
    )                           //   end of r.map()
  ) | B ?                       // end of outer a.map(); if B was updated:
    f(a, R[C] = ++n)            //   update the best target seat and do a recursive call
  :                             // else:
    a                           //   stop recursion and return a[]