UVA тральщик неправильный ответ на C
Я работал над задачей UVA 10189: Сапер, и я продолжаю получать неправильный ответ в качестве вердикта, хотя мой код отлично работает для предложенных тестовых случаев (и дополнительных тестовых примеров, которые я придумаю). Я нашел много сообщений здесь, отладочных кодов для этой проблемы, но ни один из них не подходит для моего случая.
Буду признателен, если кто-нибудь из вас сможет помочь мне понять, что не так с моим кодом.
Проблема:
Вы когда-нибудь играли в Сапер? Это милая маленькая игра, которая входит в состав определенной операционной системы, название которой мы не можем вспомнить. Итак, цель игры - найти все мины в поле M × N. Чтобы помочь вам, игра показывает число в квадрате, которое говорит вам, сколько мин находится рядом с этим квадратом. Например, поместите следующее поле 4 × 4 с 2 минами (которые представлены символом "*"):
*...
....
.*..
....
Если бы мы представили одно и то же поле с номерами подсказок, описанными выше, мы бы получили:
*100
2210
1*10
1110
Как вы уже могли заметить, у каждого квадрата может быть не более 8 соседних квадратов.
вход
Ввод будет состоять из произвольного числа полей. Первая строка каждого поля содержит два целых числа n и m (0
Выход
Для каждого поля вы должны напечатать следующее сообщение только в одной строке: Поле #x: Где x обозначает номер поля (начиная с 1). Следующие n строк должны содержать поле с символом "." символы заменяются количеством смежных мин к этому квадрату. Между полевыми выходами должна быть пустая строка.
Пример ввода:
4 4
*...
....
.*..
....
3 5
**...
.....
.*...
0 0
Пример вывода:
Field #1:
*100
2210
1*10
1110
Field #2:
**100
33200
1*100
Исходный код:
#include<stdio.h>
#include<stdlib.h>
//the two boundaries functions check whether
//the corner indices of the "sub-grid" are within the boundaries of the field
int BoundariesTop(int i){
if (0 <= i-1)
return (i-1);
else
return 0;
}
int BoundariesBottom(int i, int n) {
if (i+1 < n)
return (i+1);
else
return (n-1);
}
//CheckBomb is used to check every "sub-grid" (one cell + 8 adjacents)
//and count the number of bombs it contains.
void checkBomb(int spotI, int spotJ, int topI, int topJ, int bottomI, int bottomJ, int field[101][101]){
int i, cnt = 0,j;
for(i = topI; i <= bottomI; i++){
for(j = topJ; j <= bottomJ; j++){
if(field[i][j] == -1)
cnt++;
}
}
if(field[spotI][spotJ] != -1)
field[spotI][spotJ]= cnt;
}
int main (void){
int r, c, i, j, field[101][101], c1, z1, c2, z2, cnt = 0;
char cell, temp;
while (scanf("%d %d",&r,&c) && (r != 0 && c != 0)) {
cnt++;
//get the field
//replace symbols with integer for computation purposes.
for(i = 0; i<r; i++) {
scanf("%c",&temp);
for (j = 0; j<c; j++) {
scanf("%c",&cell);
if (cell == '*')
field[i][j] = -1;
else if (cell == '.')
field[i][j] = 0;
}
}
// Select and send sub-grid to be checked in function : checkBomb
for(i = 0; i<r; i++){
for(j = 0; j<c; j++){
//(c1,z1) are coordinates of top left of sub-grid
c1 = BoundariesTop(i);
z1 = BoundariesTop(j);
//(c2,z2) are coordinates of bottom right of sub-grid
c2 = BoundariesBottom(i,r);
z2 = BoundariesBottom(j,c);
checkBomb(i,j,c1,z1,c2,z2,field);
}
}
// Print Result
printf("Field #%d:",cnt);
for(i = 0; i<r; i++) {
printf("\n");
for (j = 0; j<c; j++) {
if (field[i][j] == -1)
printf("*");
else
printf("%d",field[i][j]);
}
}
printf("\n");
}
return 0;
}