Imagine that a chessboard with black and white squares. If a bishop is on a white square, can it attack bishops on black squares? No. So you can divide the chessboard into two independent ones. Then rotate each board for PI/4 and now the diagonal line becomes vertical. Now the problem of bishops becomes that of rooks.
We denote the number of cells of the i'th row contains with r[i]. In fact, the order of rows does not matter, so we can sort the rows with r[i]. We use c[i][j] to represent the number of cases to put j rooks in the first i rows. The we have the following recurrence,
c[i][j] = c[i-1][j] + c[i-1][j-1] * (r[i] - (j-1))
with the boundary conditions,
c[i][0] = 1, 0 <= i <= n, and
c[0][j] = 0, 1 <= j <= k
Now, we have got the results of the two boards. A simple accumulation would give us the final results.
Code: