1. 程式人生 > >九度 題目1020:最小長方形

九度 題目1020:最小長方形

一.題目描述:
    給定一系列2維平面點的座標(x, y),其中x和y均為整數,要求用一個最小的長方形框將所有點框在內。長方形框的邊分別平行於x和y座標軸,點落在邊上也算是被框在內。

輸入:
    測試輸入包含若干測試用例,每個測試用例由一系列座標組成,每對座標佔一行,其中|x|和|y|小於 231;一對0 座標標誌著一個測試用例的結束。注意(0, 0)不作為任何一個測試用例裡面的點。一個沒有點的測試用例標誌著整個輸入的結束。
輸出:
    對每個測試用例,在1行內輸出2對整數,其間用一個空格隔開。第1對整數是長方形框左下角的座標,第2對整數是長方形框右上角的座標。

樣例輸入:

12 56
23 56
13 10
0 0
12 34
0 0
0 0

樣例輸出:

12 10 23 56
12 34 12 34

二.題目分析

   本來是一道水題,卻硬是做出了轉狂的感覺。折騰了那麼久,終於找到了出錯的地方,關於九度OJ,我是徹底拜服,到現在為止,我還是不明白為什麼另一種輸入方式就會WA,在此把WA和AC的都貼出來,大家自己感覺吧,也希望知道原因的高手可以留言解釋一下原因,不勝感激!

三.程式碼

1.WA

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x1,y1,x2,y2,x,y;

    while((scanf("%d%d",&x1,&y1))&&x1&&y1)  //注意此處的輸入方式與下文對比
    {

        x2=x1;y2=y1;

        while((scanf("%d%d",&x,&y))&&x&&y)
        {
            if(x<x1)
                x1=x;
            if(y<y1)
                y1=y;
            if(x>x2)
                x2=x;
            if(y>y2)
                y2=y;
        }
        printf("%d %d %d %d\n",x1,y1,x2,y2);
    }
    return 0;
}




2.AC

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int x1,x2,y1,y2,x,y;

    while(scanf("%d%d",&x1,&y1))  //同樣對比輸入方式,只是改變了迴圈跳出的方式,就AC了,終於找到了WA的原因,但是不明白....
    {
        if(x1==0&&y1==0)
            break;
        x2=x1;y2=y1;
        while(scanf("%d%d",&x,&y))
        {
            if(x==0&&y==0)
                break;

            if(x<x1)
                x1=x;
            if(y<y1)
                y1=y;
            if(x>x2)
                x2=x;
            if(y>y2)
                y2=y;
        }

        printf("%d %d %d %d\n",x1,y1,x2,y2);
    }

    return 0;
}