liferookie @ 2023-09-14 22:00:23
如题,真的是搞不明白,明明答案感觉没问题
#include <stdio.h>
int main(){
int n;
int oneNumber=0;
int zeroNumber=0;
char c[200];
for(int i=0;i<200;i++){
scanf("%c",&c[i]);
if(c[i]=='\n'||c[i]=='\0'){
n=i;
break;
}
} //读取第一行
char a[n-1][n];
for(int x=0;x<n-1;x++){ //上面已经读取一行了,则n-1
for(int y=0;y<=n;y++){ //需要y=n读取后面的'\n'防止变量混乱
scanf("%c",&a[x][y]);
}
} //剩下的行
printf("%d",n); //输出行数
for(int i=0;i<n;i++){
if(c[i]=='0'){
zeroNumber++;
if(oneNumber!=0){//证明是一后首个零
printf(" %d",oneNumber);
oneNumber=0; //清空'1'的个数
} //第一个零则输出上个一的个数
} else { //非'0'则'1'
if(zeroNumber==0 && oneNumber==0){
printf(" 0");
} //第一个一没有上个零证明是第一个数,需要输出0
oneNumber++;
if(zeroNumber!=0){//证明是零后首个一
printf(" %d",zeroNumber);
zeroNumber=0; //清空'0'的个数
}
}
} //仅为第一行,需要更换变量重复代码
for(int x=0;x<n-1;x++){
for(int y=0;y<n;y++){
if(a[x][y]=='0'){
zeroNumber++;
if(oneNumber!=0){
printf(" %d",oneNumber);
oneNumber=0;
}
} else {
oneNumber++;
if(zeroNumber!=0){
printf(" %d",zeroNumber);
zeroNumber=0;
}
} //重复的代码
if(x==n-2 && y==n-1){ //最后一位数直接打印
if(zeroNumber==0){
printf(" %d",oneNumber);
} else {
printf(" %d",zeroNumber);
}
}
}
}
return 0;
}
by liferookie @ 2023-09-14 22:04:29
@microchip help me
by liferookie @ 2023-09-14 22:32:34
将11行 的if(c[i]=='\n'||c[i]=='\0') 更改为{if(c[i]!='0'&&c[i]!='1') 可过一个AC
by microchip @ 2023-09-15 17:54:11
@liferookie 以你发帖的代码进行更正
第23行应该输出n-1
第51行的 else 应改为 else if(a[x][y]=='1')
至于为什么嘛,我也不太清楚评测机对字符的判定方式,但根据你错的数据点反馈,似乎评测机对'\n'的理解和我们理解的不太一样(
所以字符串处理问题我个人习惯用string,不容易出锅,建议你习惯用string,我还没见过有哪些题必须用字符数组不能用字符串
by microchip @ 2023-09-15 17:57:52
还有我们认识吗QwQ
by liferookie @ 2023-09-27 17:57:11
@microchip c的字符串不会用(捂脸 kotlin的字符串好用多了。
我是在其他的讨论里看到您回答了别人的问题,于是询问您,期望着您能解决我的问题
by liferookie @ 2023-09-29 17:14:32
@microchip 我这改来改去还是有问题,换kotlin用字符串一遍过https://www.luogu.com.cn/record/126580726