Personally, I prefer the OTBS
Code:
// case 1
// with braces, and good indentation
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (arr[i][j] == -1) {
arr[i][j] = 1;
count++;
}
}
}
printf("Success\n");
// case 2
// with braces, but a train-wreck indent
// The compiler doesn't care, but human readers
// are puking over the keyboard
for (int i = 0; i < m; i++)
{ for (int j = 0; j < n; j++) { if (arr[i][j] == -1) {
arr[i][j] = 1; count++;
} } }
printf("Success\n");
// case 3
// without braces, but correctly indented
// it's not what the compiler sees, but as a programmer
// you know what it all means
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (arr[i][j] == -1)
arr[i][j] = 1;
count++;
printf("Success\n");
Presumably, brace counters have no problem parsing case 2 any slower than parsing case 1.
My point about case 3 is that if you use indentation to convey the program flow, and only (in a loose sense of getting a formatter to turn case 2 into case 1) rely on braces to tell you the meaning when the indentation is all screwed up. Braces are syntactic sugar for the compiler. For that reason, I prefer the compact forms.
Any programmer could add the braces to case 3 and preserve the meaning without any difficulty at all.
Maybe part of the reason is I'm from the old school, who learnt to program on 80x25 teletypes, where burning half the screen height on empty lines containing only braces was not a good use of the resources.
The only real rule when it comes to your choice of brace style is to be consistent about it.