資料對拍是一種通過找到錯誤輸出資料尋找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...