我要解决的问题是这样的:
您会得到一个矩形蛋糕,以r×c网格表示。每个单元格都有一个邪恶的草莓,或者是空的。例如,一个3×4的蛋糕可能如下所示:
终结者要吃蛋糕了!每次进餐时,他选择不包含任何有害草莓并且至少包含一个以前从未食用过的蛋糕单元的行或列,并在那里吃所有的蛋糕单元。他可以决定吃很多次。
请输出结块机可以吃的最大结块单元数。
输入的第一行包含两个整数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')
是错误的,但我不知道原因。
更正的代码,通过“ <--- change”通知更改
#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;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句