竹園論壇

標題: 常見的多測資輸入方式 [打印本頁]

作者: domen111    時間: 2014-12-7 17:00
標題: 常見的多測資輸入方式
本帖最後由 domen111 於 2014-12-7 21:13 編輯

Green Judge 有很完整的練習題: 公平的戰役
TOJ上的練習題: 南極熊大遷徙

一、T行版
題目開頭給你一個數字T告訴你有T筆測資
方法一,用for迴圈,簡單易理解的方法
[C++] 純文本查看 復制代碼
#include<iostream>
using namespace std;
int main()
{
        int T;
        cin>>T;
        for(int i=0;i<T;i++)
        {
                //code
        }
}

方法二,用while,比較不易理解,但好處是程式碼較短,且不會多一個變數i,避免以後for迴圈必須從j開始編號
[C++] 純文本查看 復制代碼
#include<iostream>
using namespace std;
int main()
{
        int T;
        cin>>T;
        while(T--)
        {
                //code
        }
}
每次while迴圈都會將T減1,直到T=0就結束
二、0結尾版
方法一,用無窮迴圈,直到0為止
[C++] 純文本查看 復制代碼
#include<iostream>using namespace std;
int main()
{
        while(1)
        {
                int a,b; //測資資料
                cin>>a>>b;
                if(a==0&&b==0)
                        break;
                //...
        }
}
方法二,更漂亮的寫法,省下好幾行,類似EOF版的寫法
[C++] 純文本查看 復制代碼
#include<iostream>
using namespace std;
int main()
{
        int a,b; //測資資料
        while(cin>>a>>b && (a!=0||b!=0))
        {
                //...
        }
}

其實也可以用「,」
[C++] 純文本查看 復制代碼
#include<iostream>
using namespace std;
int main()
{
        int a,b; //測資資料
        while(cin>>a>>b, a!=0||b!=0)
        {
                //...
        }
}
三、EOF版
題目完全沒有告訴你總共有幾筆測資,也沒有說如何結尾,那該怎麼辦呢?
用無窮迴圈一直讀嗎? 不行啊! 這樣會TLE的
其實當測資檔結束時是有辦法在程式中偵測到的,那叫做EOF(End Of File)
當cin讀到EOF時的回傳值能夠自動轉型成false,所以直接放在while裡就行了
[C++] 純文本查看 復制代碼
#include<iostream>
using namespace std;
int main()
{
        int a,b; //測資資料
        while(cin>>a>>b)
        {
                //...
        }
}
scanf的寫法:
[C++] 純文本查看 復制代碼
#include<cstdio>
using namespace std;
int main()
{
        int a,b;
        while(scanf("%d %d",&a,&b)!=EOF)
        {
                //...
        }
}


[C++] 純文本查看 復制代碼
#include<cstdio>
using namespace std;
int main()
{
        int a,b;
        while(~scanf("%d %d",&a,&b))
        {
                //...
        }
}
那麼這樣要怎麼在本機自己測試呢?
Windows底下在黑視窗裡面按下Ctrl+Z或Ctrl+X就相當於EOF,你們可以測試看看


其他競賽常見的輸入方式可以參考這篇









歡迎光臨 竹園論壇 (http://forum.tfcis.org/) Powered by Discuz! X3.2