同一个用例,两次测试结果不一样!!跪求解释!!!

zhou0818 2010-07-27 10:15:56
最小长方形


Problem Description
给定一系列2维平面点的坐标(x, y),其中x和y均为整数,要求用一个最小的长方形框将所有点框在内。长方形框的边分别平行于x和y坐标轴,点落在边上也算是被框在内。


Input
测试输入包含若干测试用例,每个测试用例由一系列坐标组成,每对坐标占一行,其中|x|和|y|小于 231;一对0 坐标标志着一个测试用例的结束。注意(0, 0)不作为任何一个测试用例里面的点。一个没有点的测试用例标志着整个输入的结束。


Output
对每个测试用例,在1行内输出2对整数,其间用一个空格隔开。第1对整数是长方形框左下角的坐标,第2对整数是长方形框右上角的坐标。


Sample Input
12 56
23 56
13 10
0 0
12 34
0 0
0 0


Sample Output
12 10 23 56
12 34 12 34
——————————————————————————————————————
代码如下:
#include <stdio.h>
int main()
{
int a,b,m1,m2,n1,n2;

scanf("%d%d",&a,&b);

while(scanf("%d%d",&a,&b)!=EOF)
{
m1=231;
n1=231;
m2=-231;
n2=-231;

while(a&&b)
{
if(a<m1)
m1=a;
if(b<n1)
n1=b;
if(a>m2)
m2=a;
if(b>n2)
n2=b;

scanf("%d%d",&a,&b);
}
printf("%d %d %d %d\n",m1,n1,m2,n2);
}

return 0;
}



第一个输入用例第一次输进去output不对,变成 13 10 23 56而不是12 10 23 56 之后重复输入这个用例测试又正常了 跪求解释!!!!!!!!
...全文
522 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
The_Only_Name_2 2010-07-31
  • 打赏
  • 举报
回复
发现错的地方太多了,当时没上机调试
不过思路就是这样了,我也懒得改了
The_Only_Name_2 2010-07-30
  • 打赏
  • 举报
回复
呃……两个地方
printf("The rectangle is %d,%d and %d,%d",hmin,vmin,hmax,vmax);
return 1;
The_Only_Name_2 2010-07-30
  • 打赏
  • 举报
回复
写错了一个地方
if(i==0) return 0;
The_Only_Name_2 2010-07-30
  • 打赏
  • 举报
回复
最右的点未必是最下的点,最左的也未必是最上的点,这个题目我觉得有更简单的实现:


#define MAXNUM 30
#include <stdio.h>

int main()
{
int h[MAXNUM];//储存横坐标的点
int v[MAXNUM];//储存纵坐标的点
int i=0,j=1;//计数器

while()
{
scanf("%d%d",&h[i],&v[i]);
if(h[i]||v[i]) break;
i++;
}

if(i=0) return 0;
int hmin=h[0],hmax=h[0],vmin=v[0],vmax=v[0];
while(j<i)
{
hmin=hmin<h[j]?hmin:h[j];
hmax=hmax>h[j]?hmax:h[j];
vmin=vmin<v[j]?vmin:h[j];
vmax=vmax>v[j]?vmax:h[j];
}
printf("The rectangle is %d,%d and %d,%d",hmin,vmin,hmax,vmax);
return 0;
}
zhou0818 2010-07-30
  • 打赏
  • 举报
回复
唉。。。谁要是会的话,用c语言把代码写一遍给小弟吧。。。不要说什么这么简单的程序调试调试就好了。。。相信会的人只要两三分钟就能搞定的。。。
zhou0818 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 the_only_name_2 的回复:]
最右的点未必是最下的点,最左的也未必是最上的点,这个题目我觉得有更简单的实现:


C/C++ code

#define MAXNUM 30
#include <stdio.h>

int main()
{
int h[MAXNUM];//储存横坐标的点
int v[MAXNUM];//储存纵坐标的点
int i=0,j=1;//计数器

……
[/Quote]
这个。。。你这个程序在scanf语句读入第一对点的坐标之后,遇到if(h[i]||v[i]) break;
语句。。。只要输入的不是(0,0),之后就跳出while语句,然后运行到if(i==0) return 0;语句。。。那不就直接程序运行结束了吗???貌似程序无法运行啊。。。
zhou0818 2010-07-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 bulijun1987 的回复:]

你的程序的算法是有问题的:
你这样做其实是一种贪心算法,不会得到正确的结果的

你应该吧所有的点都保存下来,找最右下角的点,和最左上的点,
这样才能把所有的点都框起来。
[/Quote]
算法应该没问题吧。经测试,我的程序已经得到正确,不信你可以试试。我的程序思路就是寻找最左下和右上的点。他运行的过程是第一次先接受一个点,之后每次接受的点都和上一次的比较,看是不是更左下或者更右上,如果是的话就把这个点存储下来,到时候把他在屏幕上输出来。这个和你的算法不是一样的么?(我这个应该不是贪心算法吧。。。)
bulijun1987 2010-07-29
  • 打赏
  • 举报
回复
你的程序的算法是有问题的:
你这样做其实是一种贪心算法,不会得到正确的结果的

你应该吧所有的点都保存下来,找最右下角的点,和最左上的点,
这样才能把所有的点都框起来。
gradual 2010-07-29
  • 打赏
  • 举报
回复
调试会吗?这么简单的程序不可能调试不出问题所在。。
zhou0818 2010-07-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 gradual 的回复:]

调试会吗?这么简单的程序不可能调试不出问题所在。。
[/Quote]
现在程序没有错误,就是提交的时候不能accepted。。。。。。
dahaiI0 2010-07-28
  • 打赏
  • 举报
回复
第一次读12,56白读了,所以跟直接读23 56 ,13 10 ,0 0没区别,至于后面有时对可能是缓冲区问题吧,我也不太懂,不过很明显scanf("%d%d",&a,&b);这句是多余的
dahaiI0 2010-07-28
  • 打赏
  • 举报
回复
我想知道scanf("%d%d",&a,&b);这句有什么用,你先把这句注释掉看看
gradual 2010-07-28
  • 打赏
  • 举报
回复
打断点调试一下,如果每次都能重现的话
zhou0818 2010-07-28
  • 打赏
  • 举报
回复
唉。3楼、4楼是同一个人啊。。。没注意啊
zhou0818 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 dahaii0 的回复:]

我想知道scanf("%d%d",&a,&b);这句有什么用,你先把这句注释掉看看
[/Quote]
这句确实多余了。不过还想问下我下面这个程序是不是还不符合题意啊?怎么一直是wrong answer啊?
#include <stdio.h>
int main()
{
int a,b,m1,m2,n1,n2;

scanf("%d%d",&a,&b);

while(a&&b)
{
m1=231;
n1=231;
m2=-231;
n2=-231;

while(a&&b)
{
if(a<m1)
m1=a;
if(b<n1)
n1=b;
if(a>m2)
m2=a;
if(b>n2)
n2=b;

scanf("%d%d",&a,&b);
}
printf("%d %d %d %d\n",m1,n1,m2,n2);

scanf("%d%d",&a,&b);
}

return 0;
}
zhou0818 2010-07-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dahaii0 的回复:]

第一次读12,56白读了,所以跟直接读23 56 ,13 10 ,0 0没区别,至于后面有时对可能是缓冲区问题吧,我也不太懂,不过很明显scanf("%d%d",&a,&b);这句是多余的
[/Quote]
嗯,这句确实多余了。再问下,我把程序改成下面这样了为什么还是wrong answer,是不是还不符合题意?
#include <stdio.h>
int main()
{
int a,b,m1,m2,n1,n2;

scanf("%d%d",&a,&b);

while(a&&b)
{
m1=231;
n1=231;
m2=-231;
n2=-231;

while(a&&b)
{
if(a<m1)
m1=a;
if(b<n1)
n1=b;
if(a>m2)
m2=a;
if(b>n2)
n2=b;

scanf("%d%d",&a,&b);
}
printf("%d %d %d %d\n",m1,n1,m2,n2);

scanf("%d%d",&a,&b);
}

return 0;
}
飞天赤狐 2010-07-28
  • 打赏
  • 举报
回复
你把程序退出再打开, 看第一次是正确错误, 如果正确, 那就是正确的, 不用细究原因了。

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧