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;
}

0 ответов

Другие вопросы по тегам