2014-10-28 51 views
-3

我試圖解決的問題是:我的算法代碼有什麼問題?

給你一個長方形的蛋糕,作爲代表的R×C網格。每個細胞有一個邪惡的草莓,或者是空的。例如,一個3×4蛋糕可能看起來如下:

cakeminator會吃蛋糕!每次他吃東西時,他會選擇一行或一列不含任何邪惡的草莓,並且至少包含一個以前沒有吃過的蛋糕細胞,並在那裏吃掉所有的蛋糕細胞。他可能會決定吃任何次數。

請輸出cakeminator可以吃的蛋糕的最大數量。

第一行輸入包含兩個整數r和c(2≤r,c≤10),表示餅的行數和列數。接下來的r行分別包含c個字符 - 第i行的第j個字符表示第i行和j列單元格的內容,可以是以下任意一個:

'。'字符表示沒有邪惡草莓的蛋糕單元;

'S'字符表示帶有邪惡草莓的蛋糕細胞。

輸出結塊器可以吃的蛋糕的最大數量。

下面是應該產生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

cake [i] [j]正在存儲整數值。在比較之前將其轉換爲整數。 – 2014-10-28 11:27:13

+5

將「for」循環格式化爲一行,您會發現代碼更容易閱讀 – thumbmunkeys 2014-10-28 11:28:03

+1

@AlterMann - nope。它是一個字符而不是字符串。 – 2014-10-28 11:29:50

回答

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'解決了一個問題,但刪除新行的跳過並沒有幫助。 – 2014-10-28 11:58:45

+0

感謝您的幫助,指出數組類型的錯誤。但不幸的是,您的代碼是錯誤的。現在我知道如何編寫正確的代碼。 – Maxmengt 2014-10-28 12:09:49

+0

我沒有首先檢查邏輯。順便說一句,這是一個簡單的廣度優先搜索(BFS)問題。 – 2014-10-28 12:11:21

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