Note: The terminology I've used here might or might not be standard.
For any n dimensional array, we need n asterisks$(*)$ in valid pointer code text to get the array elements.
printf ("%u, %u, %u", x + 3, *(x + 3), *(x + 2) + 3);
Here, we've used max one asterisk in any argument, and the array is 2 dimensional. So no way we'll get the elements of the array as the output.
So, Options B, C and D are wrong. A must be the answer.
Now, why is A the answer?
x + 3
We know the array name stores the address of the first element of the array. Here, what does x store? 1? No.
The first element is {1,2,3}, ie, the first "sub array"
Hence, x+3 would point to {10,11,12}. It's easy to notice that is the address 2036.
*(x + 3)
As seen, (x+3) points to {10,11,12}. So, dereference it, you'll reach the address of the first element of it, ie 10.
Address of 10, is 2036, of course.
*(x + 2) + 3
Very similarly, (x+2) Would point to {7,8,9}. Dereference this "sub array" you'll now point to just 7. Add 3, you'll point to 10. So you'll point at the address 2036.