POJ 1017解题报告

这题看起来简单,实际上要考虑的地方不少,一不小心就可能漏掉某条件导致WA,我一次测了1000组输入输出才发现自己原来的代码里面有40组输出是错误的,然后一步步调试,终于AC了。一直WA又找不到自己错在哪的感觉太让人抓狂了


我自己的整个调试代码如下


#include<stdio.h>
int num(int a,int b,int c,int d,int e,int f){
int x=0;
int adui3=0,adui2=0,adui4=0;
x+=d+e+f;
if(c>0){
if(c%4!=0){
x+=c/4+1;
c=c%4;
printf("C大于4且C不能被4整除,C此时=%d,此时x=%d\n\n",c,x);
}
else{
x+=c/4;
c=0;
printf("C能被4整除,C=%d,此时x=%d\n\n",c,x);
}
}


if(a>=11*e){
a=a-11*e;
printf("第五种的空隙满足不了第一种,即e满足不了a,a塞完e后等于%d,此时x=%d\n\n",a,x);
}
else{
a=0;
printf("第五种的空隙满足了第一种,即e满足了a,a塞完e后等于%d,此时x=%d\n\n",a,x);
}
if((b==0)&&(a>=20*d)){
a=a-20*d;
printf("由于没有第二种(b=0)且第五种和第四种的空隙都满足不了第一种,即e和d都满足不了a,a塞完e和d后等于%d,此时x=%d\n\n",a,x);
}
else if((b==0)&&(a<20*d)){
a=0;
printf("由于没有第二种(b=0)且第五种和第四种的空隙满足了第一种,即e和d满足了a,a塞完e和d后等于%d,此时x=%d\n\n",a,x);
}


if(b>=5*d){
b=b-5*d;
printf("第四种的专为2X2准备的空隙满足不了第二种,即d满足不了b,b塞完d后等于%d,此时x=%d\n\n",b,x);
}
else{
adui4=5*4*d-b*4;
b=0;
printf("第四种的专为2X2准备的空隙满足了第二种,即d满足了b,b塞完d后等于%d,此时x=%d\n\n",b,x);
if(a>adui4){
a=a-adui4;
printf("第二种塞不满第四种的空隙,剩下第四种的空隙让第一种塞,容纳不了所有的第一种,还剩%d个第一种,此时x=%d\n\n",a,x);
}
else{
a=0;
printf("第二种塞不满第四种的空隙,剩下第四种的空隙让第一种塞,容纳得了所有的一种,一种和第二种就此都塞完了,此时x=%d\n\n",x);
}
}
if(c>0){
if(b>0){
    if(b>=((3-c)*2+1)){
b=b-((3-c)*2+1);
adui3=8-c;
printf("由于第二种塞完第四种之后还有,且第二种的实际数目大于等于在第三种的缝隙中能塞的第二种数目,所以塞完第三种之后b还剩%d  且产生了可以塞%d个第一种的空隙,此时x=%d\n\n",b,adui3,x);
}
else{
adui3=((3-c)*2+1-b)*4+8-c;
b=0;
printf("由于第二种塞完第四种之后还有,但数量小于第三种的缝隙中能塞的第二种数量,所以第二种塞完了,在第三种中留下能塞%d个第一种的空隙,此时x=%d\n\n",b,adui3,x);
}
}
else{
adui3=36-c*9;
printf("由于b已经没有了,在第三种中只能塞第一种,能塞%d个,此时x=%d\n\n",adui3,x);
}
}
if(a>0){
if(a>adui3){
a-=adui3;
printf("将还有的第一种塞第三种,且塞满了还有剩,剩%d个第一种,即还有%d个a,此时x=%d\n\n",a,a,x);
}
else{
a=0;
printf("将还有的第一种塞第三种,第一种全塞进去了,没有剩下的第一种了,a=0了");
}
}
if(b>0){
if(b>=9){
if((b%9)!=0){
   x+=b/9+1;
   b=b%9;
printf("对于还剩下的第二种,此时第三,第四,第五已经全部都塞满了,让剩下的第二种自己玩,且第二种的数目不是9的倍数,9个第二种拼成完整的一层,拼成了%d个完整层,加上不完整的共%d层,此时总共有%d层\n\n",b/9,b/9+1,x);
}
else{ 
x+=b/9;
printf("对于还剩下的第二种,此时第三,第四,第五都已经全部塞满了,让剩下的第二种自己玩,但是剩下的第二种正好是9个的倍数,拼成了%d个完整层,此时总共有%d层\n\n",b/9,x);
b=0;
}
}
else{
x+=1;
printf("对于还剩下的第二种,此时第三,第四,第五都已塞满,剩下的第二种不满9个,拼成一个不完整层,此时总共有%d层\n\n",x);
}
}
if(b>0){
adui2=36-4*b;}
printf("对于现在的顶部是个不满9个的第二种拼成的不完整层的情况,顶层产生了能塞%d个第一种的空隙,此时x=%d\n\n",adui2,x);
if(a>0){
if(a>adui2){
a=a-adui2;
printf("此时第一种的数量大于不完整的顶层能容纳的第一种数量,塞完之后还剩%d个第一种,此时x=%d\n\n",a,x);
}
else{ 
a=0; 
printf("不满9个的第二种拼成的顶层能够容纳所有的剩下的第一种,结束了,总共有%d层\n\n",x);
}
}
if(a>36){
if(a%36!=0){
x+=(a/36)+1;
printf("由于不满9个的第二种拼成的那个顶层不能容纳所有的剩下的第一种,故还剩下的第一种自己拼层了,且此时还剩下的第一种大于36且为36的倍数,可拼完整的%d层,整个结构这时总共有%d层\n\n",a/36+1,x);
}
else{
x+=a/36;
printf("由于不满9个的第二种拼成的那个顶层不能容纳所有的剩下的第一种,故还剩下的第一种自己拼层了,且此时还剩下的第一种大于36且不为36的倍数,可拼完整加不完整的%d层,整个结构这时总共有%d层\n\n",a/36,x);
}
}
else if(a>0){
x+=1;
printf("由于不满9个的第二种拼成的那个顶层不能容纳所有的剩下的第一种,故还剩下的第一种自己拼层了,且此时还剩下的第一种小于等于36,正好是一层,整个结构总共%d层\n\n",x);
}
return x;
}


int main(){
/*FILE *fp1,*fp2;
int cuowu[40];
int **cuowu2=new int*[40];
for(int j=0;j<40;j++){
cuowu2[j]=new int[6];
}
int yingyou[40];
int shiji[40];
int d=0,i=0;
fp1=fopen("C:\\Users\\yxnot\\desktop\\1017测试数据.txt","r");
fp2=fopen("C:\\Users\\yxnot\\desktop\\1017测试结果.txt","r");
if(fp1==NULL){printf("可能你打开的是个假文档,空的");
}
int *yanzheng=new int[6];
int yanzheng2;
while(fscanf(fp1,"%d%d%d%d%d%d",yanzheng,yanzheng+1,yanzheng+2,yanzheng+3,yanzheng+4,yanzheng+5)!=EOF&&(fscanf(fp2,"%d",&yanzheng2))!=EOF){
printf("这次读入的一组测试数据是:%d  %d  %d  %d  %d  %d\n这次读入的一个理想测试结果是:%d   ",yanzheng[0],yanzheng[1],yanzheng[2],yanzheng[3],yanzheng[4],yanzheng[5],yanzheng2);
if(yanzheng[0]==0&&yanzheng[1]==0&&yanzheng[2]==0&&yanzheng[3]==0&&yanzheng[4]==0&&yanzheng[5]==0){
printf("\n\n总验证失败次数:%d\n\n错误数据组:",d);
for(int j=0;j<40;j++){
printf("\n\n第%d组:\n测试数据: %d  %d  %d  %d  %d  %d  应有结果: %d  实际结果: %d\n\n",cuowu[j],cuowu2[j][0],cuowu2[j][1],cuowu2[j][2],cuowu2[j][3],cuowu2[j][4],cuowu2[j][5],yingyou[j],shiji[j]);
}
break;
}
int c=num(yanzheng[0],yanzheng[1],yanzheng[2],yanzheng[3],yanzheng[4],yanzheng[5]);
printf("该组数据实际的测试结果是:%d   ",c);
if(c==yanzheng2){
printf("实际结果和理想结果相同,验证成功\n\n");
}
else{
cuowu[d]=i;
yingyou[d]=yanzheng2;
shiji[d]=c;
for(int j=0;j<6;j++){
cuowu2[d][j]=yanzheng[j];
}
d++;
printf("实际结果与理想结果不同,验证失败,失败次数:第%d次\n\n",d);

}
i++;
}*/
while(1){
int *a=new int[6];
scanf("%d%d%d%d%d%d",a,a+1,a+2,a+3,a+4,a+5);
if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0){
break;
}
else{
int c;
c=num(a[0],a[1],a[2],a[3],a[4],a[5]);
printf("%d\n",c);

}
}
while(1){}
return 0;
}


我自己的AC了的代码如下


#include<stdio.h>
int num(int a,int b,int c,int d,int e,int f){
int x=0;
int adui3=0,adui2=0,adui4=0;
x+=d+e+f;
if(c>0){
if(c%4!=0){
x+=c/4+1;
c=c%4;
}
else{
x+=c/4;
c=0;
}
}


if(a>=11*e){
a=a-11*e;
}
else{
a=0;
}
if((b==0)&&(a>=20*d)){
a=a-20*d;
}
else if((b==0)&&(a<20*d)){
a=0;
}


if(b>=5*d){
b=b-5*d;
}
else{
adui4=5*4*d-b*4;
b=0;
if(a>adui4){
a=a-adui4;
}
else{
a=0;
}
}
if(c>0){
if(b>0){
    if(b>=((3-c)*2+1)){
b=b-((3-c)*2+1);
adui3=8-c;
}
else{
adui3=((3-c)*2+1-b)*4+8-c;
b=0;
}
}
else{
adui3=36-c*9;
}
}
if(a>0){
if(a>adui3){
a-=adui3;
}
else{
a=0;
}
}
if(b>0){
if(b>=9){
if((b%9)!=0){
   x+=b/9+1;
   b=b%9;
}
else{ 
x+=b/9;
b=0;
}
}
else{
x+=1;
}
}
if(b>0){
adui2=36-4*b;}
if(a>0){
if(a>adui2){
a=a-adui2;
}
else{ 
a=0; 
}
}
if(a>36){
if(a%36!=0){
x+=(a/36)+1;
}
else{
x+=a/36;
}
}
else if(a>0){
x+=1;
}
return x;
}


int main(){

while(1){
int *a=new int[6];
scanf("%d%d%d%d%d%d",a,a+1,a+2,a+3,a+4,a+5);
if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0&&a[5]==0){
break;
}
else{
int c;
c=num(a[0],a[1],a[2],a[3],a[4],a[5]);
printf("%d\n",c);

}
}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值