競プロのテストケース作成方法

競技プログラミングでテストケースを作るためのテンプレートを置きます。

ランダムでのケース自動生成、自動でのファイル作成を前提にしています。

ファイル名はAtcoder形式です。

 

・Solve()...問題を解く処理をここに書きます。

・Form()...入力を生成する処理をここに書きます。

・ID(int num, string type)...テストケースのファイル名を設定する関数です。

このコードだと、デスクトップに in , out というフォルダを作るとうまく行きます。

ファイルの場所やsubtaskの番号などは適宜変えてください。

・SetOut , SetIN ... 入出力先のファイルの指定、作成をします。

 

sleep関数を置いているのは、時間に依存する乱数をテストケース生成に使う場合への対策です。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include<unistd.h>
typedef long long ll;
 
using namespace std;
namespace solve{
 
};
 
void Solve(){
    solve::main();
};
 
void Form(){
    cout<<"in"<<endl;
}
 
string ID(int num,string type){
    string fil="/Users/ynymxiaolongbao/Desktop/";
    string sub="/subtask1_";
    string Num=to_string(num);
    if(Num.size()==1)Num="0"+Num;
    return fil+type+sub+Num+".txt";
}
void SetOut(int num,string type){
    FILE *out=freopen(ID(num,type).c_str(),"w",stdout);
}
void SetIn(int num,string type){
    FILE *in=freopen(ID(num,type).c_str(),"r",stdin);
}
 
int main(){
    for(int i=1;i<=20;i++){
    srand((unsigned int)time(NULL));
    sleep(1);
    SetOut(i,"in");
    Form();
     
    SetIn(i,"in");
    SetOut(i,"out");
    Solve();
    }
    return 0;
}