Covered 10x10 rectangle with L-shapes trominos We have given L-shaped trominos and a square of size 10x10. Give a nice proof, that 18 L-trominos is the minimal number with which the square can be covered such that it is impossible to insert one more L-tromino. I give an example with 18 L-trominos.

 A: Depends what you think is a "nice proof." Here are some possibilities.
By cases
Suppose that only 17 L-trominoes are placed on the grid; then 51 squares are occupied, and 49 are free.
Consider the grid to consist of 2x2 blocks in 5 rows and 5 columns.
If any one of these 25 blocks contains three free spaces, then we could place a tromino there. Otherwise, every block has at most two free squares, so there are 24 blocks with exactly two free and two occupied squares, and one block with three occupied squares.
Now in each 2x2 block, the free squares are either adjacent, or "checkered". At each corner between four blocks, you can have at most two free squares (otherwise, you could insert an L-tromino there.) Using these rules and enumerating the possible combinations of blocks, you can eventually rule them all out and conclude that an additional tromino can be placed.
The number of cases really seems to proliferate thanks to the single block with three occupied squares, though, so covering all the cases is quite a rabbit hole.
Computationally
Create the graph whose 324 vertices are all the possible positions of an L-tromino on the grid, with edges between any two mutually exclusive placements (L-tromino positions which share a vertex.)
Then compute the independent domination number of the graph.
An independent dominating set is an independent set (so, a set of tromino positions which do not overlap), such that every other vertex is adjacent to at least one (so, no more trominos may be placed); the smallest independent dominating set is what we seek.
Here are 9 lines of Sage code that do that:
N = 10
rcp = cartesian_product([range(N-1), range(N-1), range(4)])
pos = [0, 1, N, N+1]
def posns(r, c, p):
    return {r*N + c + pos[i] for i in {0,1,2,3}-{p}}
def isedge(rcp0, rcp1):
    return rcp0 != rcp1 and bool(posns(*rcp0) & posns(*rcp1))
G = Graph([rcp, isedge])
print(G.dominating_set(independent=True, value_only=True))

Here, rcp is the set of possible tromino locations, encoded as triples $(r, c, p)$ for the tromino occupying the 2x2 block with upper left corner in row $r$ and column $c$, and omitting the $p$th square (numbered from 0 to 3 in left-to-right reading order.) The function posns returns a set of the three squares occupied by a given tromino, where the squares are numbered from 0 to 99. & is the set intersection operator, and in Python a set is considered True iff it's nonempty.
The answer is 18, as you can see in this SageMathCloud notebook.
(Note: this takes many minutes to run; the cached results should be visible at the notebook. For some reason I always find it necessary to open a SageMathCloud link, go back from a login screen, and open it a second time to get a public notebook to actually display.)
By referencing the OEIS
Check out OEIS A238381.
