2014-10-28 9 views
-3

Вопрос, который я пытаюсь решить это:Что случилось с моим кодом алгоритма?

Вам предоставляется прямоугольный торт, представленный в виде г х С сеткой. Каждая клетка имеет злую клубнику или пуста. Например, торт 3 × 4 может выглядеть следующим образом:

Cakeminator собирается съесть торт! Каждый раз, когда он ест, он выбирает строку или столбец, который не содержит злой клубники и содержит по крайней мере одну ячейку для пирога, которая раньше не была съедена, и ест все там пирожные. Он может принимать пищи каждый раз.

Пожалуйста, выведите максимальное количество клеток торта, которые может съесть cakeminator.

Первая строка ввода содержит два целых числа r и c (2 ≤ r, c ≤ 10), обозначая количество строк и количество столбцов торта. Следующие r строк содержат c-символы - j-й символ i-й строки обозначает содержимое ячейки в строке i и столбце j и является либо одним из следующих:

'.' символ обозначает клетку торта без злой клубники;

Символ 'S' обозначает ячейку торта со злой клубникой.

Выведите максимальное количество клеток торта, которые может съесть cakeminator.

Вот входной образец, который должен производить 8:

3 4 
S... 
.... 
..S. 

Мой код дает 12:

#include <stdio.h> 
int main(void) { 
    int r, c; 
    scanf("%d %d", &r, &c); 
    int cake[r][c]; 
    int i, j, cnt=0, cou=0, a=0, b=0, cell=0; 
    getchar(); //reject "\n" 
    for(i=0;i<r;i++) { 
     for(j=0;j<c;j++) { 
      scanf("%c", &cake[i][j]); 
     } 
     getchar(); 
    } 
    // debug 
    // printf("%c\n", cake[0][0]); 
    //  printf("%c\n", cake[0][1]); 
    //   printf("%c\n", cake[0][2]); 
    //    printf("%c\n", cake[0][3]); 
    //     printf("%c\n", cake[2][2]); 
    for(i=0;i<r; i++) { 
     for(j=0;j<c;j++) { 
      cnt++; 
      if(cake[i][j]=='S') { 
       cnt=0; 
       break; 
      } 
     } 
     if(cnt>0) { 
      a++; 
     } 
    } 
    for(j=0;j<c;j++) { 
     for(i=0;i<r;i++) { 
      cou++; 
      if(cake[i][j]=='S') { 
       cou=0; 
       break; 
      } 
     } 
     if(cou>0) { 
      b++; 
     } 
    } 
    cell=cnt + cou - a*b; 
    printf("%d", cell); 
    return 0; 
} 

По отладки, я обнаружил, что if(cake[i][j] == 'S') это неправильно, но я не знать причину.

+1

торт [I] [J] хранит целое значение. cast 's' в целое число перед его сравнением. –

+5

отформатируйте ваши 'for' петли в одной строке, вы найдете код намного проще для чтения – thumbmunkeys

+1

@AlterMann - nope. это символ не строка. –

ответ

0

исправленный код, изменения уведомляются «< --- изменение»

http://ideone.com/ymLgnk

#include <stdio.h> 
int main(void) { 
    int r, c; 
    scanf("%d %d", &r, &c); 
    char cake[r][c]; <--- Change 
    int i, j, cnt=0, cou=0, a=0, b=0, cell=0; 
    //reject "\n" <--- Change 
    for(i=0;i<r;i++) { 
     for(j=0;j<c;j++) { 
      scanf("%c", &cake[i][j]); 
     } 
     <--- Change 
    } 
    for(i=0;i<r;i++) { 
     for(j=0;j<c;j++) { 
      cnt++; 
      if(cake[i][j]=='S') { 
       cnt=0; 
       break; 
      } 
     } 
     if(cnt>0) { 
      a++; 
     } 
    } 
    for(j=0;j<c;j++) { 
     for(i=0;i<r;i++) { 
      cou++; 
      if(cake[i][j]=='S') { 
       cou=0; 
       break; 
      } 
     } 
     if(cou>0) { 
      b++; 
     } 
    } 
    cell=cnt + cou - a*b; 
    printf("%d", cell); 
    return 0; 
} 
+0

Вы разрушили функцию ввода и не смогли исправить ошибку в алгоритме. Изменение типа массива на 'char' устранило проблему, но удаление пропусков строк новой строки не помогло. –

+0

Спасибо за вашу помощь, чтобы указать, что неправильный тип массива. Но, к сожалению, ваш код неправильный. И теперь я знаю, как писать правильный код. – Maxmengt

+0

Я не проверял логику в первую очередь. Кстати, это простой вопрос Breadth First Search (BFS). –

0

Я использовал полукокса массивы, а также ввода каждой строки в виде строки, которая сохраняет теребя ввод, когда scanf() сканирует отдельные символы. Кроме того, я проверил записи (за исключением длины разрешенных к strg)

#include <stdio.h> 
#include <string.h> 

#define MAXIND 10 

char cake[MAXIND][MAXIND+1]; 
char strg[100]; 

int main() 
{ 
    int numrows, numcols, row, col, emptyr=0, emptyc=0, cell; 
    scanf("%d %d", &numrows, &numcols); 
    if (numrows < 2 || numrows > MAXIND || numcols < 2 || numcols > MAXIND) 
     return; // bad cake size 

    // input each line 
    for (row=0; row<numrows; row++) { 
     scanf ("%s", strg); 
     strupr (strg); 
     strncpy (cake[row], strg, MAXIND); 
    } 

    // check each row 
    for (row=0; row<numrows; row++) { 
     for (col=0; col<numcols; col++) 
      if(cake[row][col]=='S') 
       break; 
     if (col == numcols) 
      emptyr++; // whole row is empty 
    } 

    // check each column 
    for (col=0; col<numcols; col++) { 
     for (row=0; row<numrows; row++) 
      if(cake[row][col]=='S') 
       break; 
     if (row == numrows) 
      emptyc++; // whole column is empty 
    } 

    // there are two ways to calculate 
    // each empty row lacks the number of empty columns 
    cell = emptyr*(numcols-emptyc) + emptyc*numrows; 
    printf("%d\n", cell); 

    // or each empty column lacks the number of empty rows 
    cell = emptyr*numcols + emptyc*(numrows-emptyr); 
    printf("%d\n", cell); 
    return 0; 
} 
Смежные вопросы