Tiling a 2^N by 2^N Grid with L-Shaped Trominoes
C, 399 bytes

char*T=&quot; |-+ | +-| &quot;,*B;w;f(N,x,y,m,n,F,h,k,i,j){w=B?F=0,w:1&lt;&lt;N|1;char b[N?w*w:6];for(k=w;k--;)b[k*w-1]=10;B=!B?F=1,m=0,n=0,x--,y--,b:B;if(N&gt;1){h=1&lt;&lt;N-1;i=x&gt;--h,j=y&gt;h;while(++k&lt;4)if(k%2-i||k/2-j)f(N-1,!(k%2)*h,!(k/2)*h,m+k%2*(h+1),n+k/2*(h+1));f(1,h&amp;i,h&amp;j,m+h,n+h);h++;f(N-1,x-h*i,y-h*j,m+h*i,n+h*j);}else while(++k&lt;4)B[w*(n+k/2)+m+k%2]=T[5*x+2*y+k];if(F)B[y*w+x]=79,B[w*w-w-1]=0,puts(N?B:&quot;O&quot;),B=0;}

No one's come forward with anything yet, so I'll offer up a meager solution. Mark my words, this is not the end. This will get shorter.
We define a function f that takes 10 arguments, but you need only call it with f(N, X, Y). Output goes to stdout.
Here's a readable version:
char*T=&quot; |-+ | +-| &quot;,*B;
w;
f(N,x,y,m,n,F,h,k,i,j){
    w=B?F=0,w:1&lt;&lt;N|1;
    char b[N?w*w:6];
    for(k=w;k--;)
        b[k*w-1]=10;
    B=!B?F=1,m=0,n=0,x--,y--,b:B;
    if(N&gt;1){
        h=1&lt;&lt;N-1;
        i=x&gt;--h,j=y&gt;h;
        while(++k&lt;4)
            if(k%2-i||k/2-j)
                f(N-1,!(k%2)*h,!(k/2)*h,m+k%2*(h+1),n+k/2*(h+1));
        f(1,h&amp;i,h&amp;j,m+h,n+h);
        h++;
        f(N-1,x-h*i,y-h*j,m+h*i,n+h*j);
    }
    else
        while(++k&lt;4)
            B[w*(n+k/2)+m+k%2]=T[5*x+2*y+k];
    if(F)B[y*w+x]=79,B[w*w-w-1]=0,puts(N?B:&quot;O&quot;),B=0;
}

A taste of output for f(3, 2, 7):
+--++--+
|+-||-+|
||+--+||
+-|-+|-+
+--+||-+
|-+|-+||
|O|||-+|
+--++--+

It's a fairly simple recursive algorithm to fill the grid. I may upload an animation of the algorithm drawing trominoes since I think it's pretty neat. As usual, feel free to ask questions and shout at me if my code breaks!
Try it online!