关于Windows和Linux下的对拍

对拍

一、Windows下的对拍

1、需要文件

  1. 编写的cpp文件及其生成的可执行文件,如:A.cpp和A.exe
  2. 保证答案正确的暴力求解文件,如:baoli.cpp和baoli.exe
  3. 数据生成文件,如:data.cpp和data.exe
  4. 保存生成数据的文本文件,如:A.in
  5. 保存输出答案的文件,如:A.out和baoli.out
  6. 对拍文件,如:check.bat或者check.cpp

2、关于求解程序的输入和数据生成程序的输出

在编写的cpp文件及暴力求解文件中,通过freopen函数重定向输入输出流(freopen是被包含于C标准库头文件<stdio.h>中的一个函数,用于重定向输入输出流。该函数可以在不改变代码原貌的情况下改变输入输出环境,但使用时应当保证流是可靠的)。

输入:freopen("***.***", "r", stdin)

输出:freopen("***.***", "w", stdout)

3、编写随机数生成程序

运用rand()函数生成随机数据,例如:

#include<cstdlib>                                         //加入这个包才能使用随机函数rand()
#include<cstdio>
#include<ctime>                                           //加入这个包就能以时间为种子初始化随机函数
#include<iostream>

using namespace std;

int main()
{
     freopen("data.in","w",stdout);                        //注意:该程序生成的数据到data.in中
     srand(time(NULL));                                    //重要:初始化随机函数,以时间为种子
     int n=rand()%10000+1;                                 //生成一个1到10000之间的随机整数n
     int m=rand()%10000+1;
     printf("%d %d\n",n,m);
     for(int i=1;i<=n;i++)printf("%d ",rand()%20000-rand()%10000);//生成-10000到10000间的数字
     printf("\n");
     for(int i=1;i<=m;i++)
     {
            int x=rand()%n+1;                                     //保证生成的数据是x<=y
            int y=x+rand()%n+1;
            if(y>n)y=n;
            printf("%d %d\n",x,y);
     }
 }
//注意:
//rand()只能生成0到32767之间的随机整数,如果要生成1到50000之间的整数,可以写成:
//rand()%30000+rand()%20000+1

4、编写对拍程序

1)直接用cpp文件

如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>

int main()
{
	for(int T = 1; T <= 1000; T++)
	{
		//自行设定适当的路经
		system("D:/C/ACM/牛客比赛/小白月赛34/A/rand.exe");
		//当前程序已经运行的CPU时间,Window下单位为ms,Unix下单位为s
		double st = clock();
		system("D:/C/ACM/牛客比赛/小白月赛34/A/A.exe");
		double ed = clock();
		system("D:/C/ACM/牛客比赛/小白月赛34/A/baoli.exe");
		if(system("fc a.out baoli.out"))
		{
			//程序立即退出,此时a.in中的数据即为错误数据 
			puts("Wrong Answer");
			return 0;
		} 
		else printf("Accepted, 测试点 #%d, 用时 %.01fms\n", T, ed - st); 
	}
	
	return 0;
}

2)用bat文件

文件后缀改为.bat, 程序如下:

:loop
 rand.exe
 baoli.exe > baoli.out
 A.exe > a.out
 fc baoli.out a.out
 if not errorlevel 1 goto loop
pause

直接运行程序,如果输出不一样,程序终止,此时的A.in文件中的数据即为出错的数据。

二、Linux下的对拍

只有对拍文件不一样,如下:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>

int main()
{
	for(int T = 1; T <= 1000; T++)
	{
        //生成的可执行文件没有后缀
		system("./rand");
		double st = clock();
		system("./A");
		double ed = clock();
		system("./baoli");
        //此处的fc改为diff
		if(system("diff a.out baoli.out"))
		{
			puts("Wrong Answer");
			return 0;
		}
		else printf("Accepted, #%d, cost %.01fms\n", T, ed - st);
	}

	return 0;
}
上一篇:帝国cms使用sql调用随机tags标签


下一篇:Go语言break语句