It's been a while since I have worked in C, so a language-specific review would not be so accurate. The only thing I can say in that aspect is that you should put curly bracket even in single-command body ifs as the code gets more readable and less error prone.
Taking a look at the problem and at your solution I think that you're overcomplicating it. You are allocating memory for each box and working with it when you actually don't need them. All you need is a square matrix - to be more precise, a lower triangular matrix - of ints (in this case).
The idea is the following:
- Represent the boxes' status via the matrix \$A\$. If the box in the position \$(x, y)\$ is wet then \$A_{x,y} = 1\$, otherwise \$A_{x,y} = 0\$. So, initially, every item in the matrix is \$0\$.
- When the box in position \$(x, y)\$ leaks you just set all the appropriate cells of \$A\$ to \$1\$ and count the number of cells whose value has changed from \$0\$ to \$1\$.
- Return the value of the counter for each case.
In pseudo-code (I'm not so practical in C), it becomes something like the following:
int[,] A = new int[7,7];
void initialize_matrix(){
for(int i = 0; i < 7, i++){
for(int j = 0; j < 7; j++){
A[i, j] = 0;
}
}
}
int count_wet_boxes(int x, int y){
int counter = 0;
for(int i = x; i >= 0; i--){
for(int j = 0; (i + j) <= (x + y); j++){
if(A[i, j] == 0){
A[i, j] = 1;
counter++;
}
}
}
return counter;
}
int main(){
initialize_matrix();
// the rest of the logic goes here
}
You can also try to ask in the Mathematics SEMathematics SE site if there is a formula you can use.
Let me know if anything's unclear.