对数器/对拍器 C++版

环境配置

1、在电脑中建立主路径目录 默认为D:/dsq/ 可修改变量mpat
2、在主路径下sample文件夹 A.cpp和B.cpp文件 A和B的名称可修改变量an和bn
3、将需要对拍的程序代码写入A.cpp和B.cpp
4、在对数器代码sample函数内设定样例格式

要使用编译模式需要将g++添加至环境变量 可以使用dev目录下\MinGW32\bin的g++
如果不使用将cmpt设置为0 并手动放置程序编译后的.exe文件到主路径 非编译模式代码不能使用#ifdef LOCAL
windows设置环境变量
Dev C++ 5.4.0下载地址

使用方法

在sample函数中配置随机生成的样例 d_rand、f_rand函数根据lr范围随机生成整数和浮点数c_rand传入一个char*随机生成字符
写好sample函数后运行对数器程序 在主路径/sample路径下查看生成的样例和AB程序的返回结果
程序只保留不一致的返回结果和样例(要求完全一致 多或少空格/回车皆为不一致)
程序运行后显示两列 左侧数值表示已经生成的样例编号 右侧表示已经测试并且不一致的个数

生成样例1 第一行一个整数n(1<=n<=100)接下来一行n个的浮点数(1.0<=v<=10.0)

void sample(stringstream &sout)
{
	int n = d_rand(1, 100);
	sout << n << endl;
	for (int i = 1; i <= n; i++)
		sout << f_rand(1, 10) << " ";
	sout << endl;
}

生成样例2 第一行一个整数n接下来n行每行一个xy表示二维坐标保证坐标无重复

void sample(stringstream &sout)
{
	map<int, map<int, int>> g; //微小的效率差距 写着爽就行
	int n = d_rand(1, 100);
	sout << n << endl;
	for (int i = 1; i <= n; i++)
	{
		int x = d_rand(1, 100), y = d_rand(1, 100);
		while (g[x][y]) //坐标重复再次随机
			x = d_rand(1, 100), y = d_rand(1, 100);
		g[x][y] = 1;
		sout << x << " " << y << endl;
	}
}

生成样例3 第一行一个整数n接下来n行表示一个n*n的矩阵.为空地#为墙

void sample(stringstream &sout) //样例生成
{
	int n = d_rand(1, 10);
	sout << n << endl;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= n; j++)
			sout << c_rand("....#"); //.的概率是4/5
		sout << endl;
	}
}

对数器代码

//需要建立主路径 和主路径下sample/ 保证程序文件存在
#include <bits/stdc++.h>
using namespace std;

string mpat("D:/dsq/");		//主路径 注意末尾跟'/'!!!! linuxpwd查看当前路径
string an("A"), bn("B");	//程序名字
int brek = 5;				//几个错误停止 -1不停止
int cmpt = 1;				//编译模式

void exec(const string &cmd, string &res)
{
	char buf[1024];
	FILE *fp = _popen(cmd.c_str(), "r"); //linux下改为popen
	while (fgets(buf, 1024, fp))
		res.append(buf);
	_pclose(fp); //linux下改为pclose
}
void wrfile(const string &path, stringstream &ss)
{
	string str;
	FILE *fp = fopen(path.c_str(), "wb");
	while (getline(ss, str))
		fprintf(fp, "%s\r\n", str.c_str());
	fclose(fp);
}
long long d_rand(long long l, long long r)
{
	int k = rand() % 4;
	long long t = rand();
	for (int i = 0; i < k; i++)
		t = t << 16 | rand();
	return l + t % (r - l + 1);
}
double f_rand(double l, double r)
{
	double t = rand() / 32767.0;
	return l + t * (r - l);
}
char c_rand(const string &ch)
{
	return ch[rand() % ch.size()];
}
void sample(stringstream &sout) //样例生成
{

}
int main()
{
	srand(time(NULL));
	rand();
	if (cmpt) //编译功能
	{
		system(("g++ " + mpat + an + ".cpp -o " + mpat + an + ".exe -std=c++11").c_str()); //C++11支持
		system(("g++ " + mpat + bn + ".cpp -o " + mpat + bn + ".exe -std=c++11").c_str());
	}
	string num, aout, bout, spat = mpat + "sample/"; //样例生成子路径
	stringstream ss;
	int cnt = 0, wa = 0;
	for (int i = 1; i <= brek; i++)
	{
		ss.clear(), ss << i, ss >> num;
		remove((spat + num + "samp.txt").c_str());
		remove((spat + num + "ans" + an + ".txt").c_str());
		remove((spat + num + "ans" + bn + ".txt").c_str());
	}
	while (wa < brek && cnt < 1e3) //几个错误停止 极限样例
	{
		ss.str(""), ss.clear(), ss << wa + 1, ss >> num;
		aout.clear(), bout.clear(), ss.clear();
		sample(ss);
		wrfile(spat + num + "samp.txt", ss);
		cout << ++cnt;
		exec(mpat + an + ".exe < " + spat + num + "samp.txt", aout);
		exec(mpat + bn + ".exe < " + spat + num + "samp.txt", bout);
		if (aout != bout)
		{
			ss.clear(), ss.str(aout);
			wrfile(spat + num + "ans" + an + ".txt", ss);
			ss.clear(), ss.str(bout);
			wrfile(spat + num + "ans" + bn + ".txt", ss);
			++wa;
		}
		cout << "\t" << wa << endl;
	}

	return 0;
}
/*------------------------------------------All rights reserved-----------------------------------------
               Author:         CaprYang
               Version:        3.1
               
               All materials not authorized may not be redirected or for other usages.
------------------------------------------------------------------------------------------------------*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值