關於資料對拍

2021-09-12 08:21:51 字數 3603 閱讀 8467

資料對拍是一種通過找到錯誤輸出資料尋找bug的方法;

首先,我們可以跟據題意通過bfs,暴力等方法寫出乙份正確的**,然後寫個隨機生成資料和驗證輸入輸出的**

我們可以拿一道題來熟悉這個流程:

路徑規劃(route)

題意很好理解,就是給出起點,和終點,求出起點到終點的所需的步數,其中上下左右,斜著走八個方向都算一步;

大致思路就是,優先斜著走,因為斜著走即在水平方向有位移,在豎直方向也有位移;

這裡有乙份根據該思路的錯誤**:

#include#include#include#define ll long long 

#define mmset(a,b) memset(a,b,sizeof(a))

using namespace std;

int main()

1.這時候如果我們想用資料對拍來找bug的話我們可以寫乙個用bfs思路的正確**,以下是bfs的正確**;

#include#include#include#include#define ll long long 

#define mmset(a,b) memset(a,b,sizeof(a))

using namespace std;

const int inf = 0x3f3f3f3f;

struct node

node(int p_x,int p_y,int p_step) };

int dir[9][2] = ;

int n,m;

int mark[305][305];

int main()

que.pop();

for(int i = 0; i < 8; i++)

}} printf("%d\n",res);

return 0;

}

2.如果我們想通過驗證輸入資料來找出錯誤資料的話,我們需要講以上兩份**的輸入輸出重定向到檔案流。

也就是把輸入的資料通過檔案輸入,並將輸出的資料輸出到檔案;

以下:

#include#include#include#define ll long long 

#define mmset(a,b) memset(a,b,sizeof(a))

using namespace std;

int main()

#include#include#include#include#define ll long long 

#define mmset(a,b) memset(a,b,sizeof(a))

using namespace std;

const int inf = 0x3f3f3f3f;

struct node

node(int p_x,int p_y,int p_step) };

int dir[9][2] = ;

int n,m;

int mark[305][305];

template t randomdata(t a, t b,t c)

else }}}

int main()

que.pop();

for(int i = 0; i < 8; i++)

}} printf("%d\n",res);

fclose(stdin);

fclose(stdout);

return 0;

}

可以看到,兩份**都是通過input0.in輸入資料的,這裡的input0.in的資料我們可以通過第3步的隨機資料來獲得。然後錯誤

**的資料輸出到output1.out裡面,正確**的資料輸出到output2.out裡面。

3.我們需要造出隨機資料來作為正確**和錯誤**的輸入,然後對別兩份**的輸出檔案進行尋找錯誤資料

如下:

#include#include#include#include#include#include#include #define ll long long 

#define mmset(a,b) memset(a,b,sizeof(a))

using namespace std;

using namespace chrono;

const int inf = 0x3f3f3f3f;

mt19937 rng; //宣告乙個隨機生成器

template t randomdata(t a, t b,t c)

else

} }}

void makedata()

int main() }

return 0;

}

該**會造出499組資料用來通過驗證兩個輸出檔案的差異來尋找bug;

當有差異的話該程式會自動停下並輸出有差異的資料

請注意03.cpp中的53行**和63行**,47行是為了給隨機函式通過當前時間設定乙個隨機種子,57行是通過使程式「休眠」

1毫秒使得隨機種子起作用。

注意,在執行03.cpp之前,必須保證

1.三個cpp檔案必須在同一資料夾下

2.01.cpp和02.cpp必須通過編譯

如果想要生成小數的話,隨機函式應該這樣寫

#include#include#include#include#include#include#include #define ll long long 

#define mmset(a,b) memset(a,b,sizeof(a))

using namespace std;

using namespace chrono;

const double inf = 0x3f3f3f3f;

std::mt19937 rng; //宣告乙個隨機生成器

template t randomdata(t a, t b,t c)

else

} }}

int main()

return 0;

}

如果想生成隨機字元應該這樣寫

#include#include#include#include#include#include#include #define ll long long 

#define mmset(a,b) memset(a,b,sizeof(a))

using namespace std;

using namespace chrono;

const double inf = 0x3f3f3f3f;

std::mt19937 rng; //宣告乙個隨機生成器

關於c 對拍的辦法

眾所周知,在 oi 學習以及考試中,對拍是一件非常重要的事。有了對拍後,我們可以利用它發現 上的一些非常難看出來的錯誤。編寫對拍程式一般有兩個辦法。編寫乙個對拍的 cpp 並且利用檔案操作和 fc 進行輸出答案的判斷。fc 是系統的函式,可以判斷兩個檔案是否一致。注意 一定要將所有的 cpp 和 e...

對拍及資料生成

對拍可以提高題目的得分率。對拍前先將std和my程式執行出exe檔案來,考試結束前不要忘了刪掉對拍語句,改成要求的檔案操作。1 include 2 3using namespace std 45 intmain 6 else puts ac 20 21 beat 資料生成 生成隨機數 define ...

關於 對拍 的一些認識

對拍是怎麼回事呢?對拍相信大家都很熟悉,但是對拍是怎麼回事呢,下面就讓小編帶大家一起了解吧。對拍是用來檢驗自己寫的正解的正確性 效率的東西。操作說明 1.準備好自己寫的暴力 b.cpp 和 b.exe 和正解 z.cpp 和 z.exe 2.寫乙個造資料的程式 shuju.cpp 和 shuju.e...