我的算法代码出了什么问题?

时间:2014-10-28 11:24:28

标签: c algorithm

我想解决的问题是:

  

您将获得一个矩形蛋糕,表示为r×c网格。每个细胞都有一个邪恶的草莓,或者是空的。例如,3×4蛋糕可能如下所示:

     

蛋糕将要吃蛋糕!每次他吃东西,他都会选择一个不含任何邪恶草莓的行或一列,并且至少包含一个以前没有吃过的蛋糕细胞,并吃掉那里的所有蛋糕细胞。他可能会决定多次吃饭。

     

请输出cakeminator可以吃的最大蛋糕细胞数。

     

第一行输入包含两个整数r和c(2≤r,c≤10),表示蛋糕的行数和列数。接下来的r行每行包含c个字符 - 第i行的第j个字符表示第i行和第j行的单元格内容,并且是以下任何一个:

     

'' character表示没有邪恶草莓的蛋糕细胞;

     

'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')错了,但我不知道原因。

2 个答案:

答案 0 :(得分:0)

更正后的代码,更改通过&#34;&lt; --- change&#34;

通知

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

答案 1 :(得分:0)

我使用了char数组,并将每一行输入为字符串,这样可以在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;
}