热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于数据对拍

数据对拍是一种通过找到错误输出数据寻找bug的方法;首先,我们可以跟据题意通过bfs,暴力等方法写出一份正确的代码,然后写个随机生成数据

数据对拍是一种通过找到错误输出数据寻找bug的方法;

首先,我们可以跟据题意通过bfs,暴力等方法写出一份正确的代码,然后写个随机生成数据和验证输入输出的代码

我们可以拿一道题来熟悉这个流程:

路径规划(route)

题意很好理解,就是给出起点,和终点,求出起点到终点的所需的步数,其中上下左右,斜着走八个方向都算一步;

大致思路就是,优先斜着走,因为斜着走即在水平方向有位移,在竖直方向也有位移;

这里有一份根据该思路的错误代码:

//01.cpp
#include
#include
#include
#define ll long long
#define mmset(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{int a,b,c,d;scanf("%d %d %d %d",&a,&b,&c,&d);int dx = abs(c - b);int dy = abs(d - b);printf("%d\n",max(dx,dy));return 0;
}

1.这时候如果我们想用数据对拍来找bug的话我们可以写一个用bfs思路的正确代码,以下是bfs的正确代码;

//02.cpp
#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
{int x,y,step;node (){}node(int p_x,int p_y,int p_step){x = p_x;y = p_y;step = p_step;}
};
int dir[9][2] = {1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,-1,-1,1};
int n,m;
int mark[305][305];
int main()
{int a,b,c,d;scanf("%d %d %d %d",&a,&b,&c,&d);queue que;que.push(node(a,b,0));int res &#61; 0;while(!que.empty()){node fro &#61; que.front();if(fro.x &#61;&#61; c && fro.y &#61;&#61; d){res &#61; fro.step;break;}que.pop();for(int i &#61; 0; i <8; i&#43;&#43;){int tx &#61; fro.x &#43; dir[i][0];int ty &#61; fro.y &#43; dir[i][1];if(tx >&#61; -100 && tx <&#61; 100 && ty >&#61; -100 && ty <&#61; 100 && mark[tx&#43;105][ty&#43;105] &#61;&#61; 0){mark[tx &#43; 105][ty &#43; 105] &#61; 1;que.push(node(tx,ty,fro.step &#43; 1));}}}printf("%d\n",res);return 0;
}

2.如果我们想通过验证输入数据来找出错误数据的话,我们需要讲以上两份代码的输入输出重定向到文件流。

也就是把输入的数据通过文件输入&#xff0c;并将输出的数据输出到文件&#xff1b;

以下&#xff1a;

//01.cpp
#include
#include
#include
#define ll long long
#define mmset(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{freopen("input0.in","r",stdin);freopen("ouput1.out","w",stdout);int a,b,c,d;scanf("%d %d %d %d",&a,&b,&c,&d);int dx &#61; abs(c - b);int dy &#61; abs(d - b);printf("%d\n",max(dx,dy));fclose(stdin);fclose(stdout);return 0;
}

//02.cpp
#include
#include
#include
#include
#define ll long long
#define mmset(a,b) memset(a,b,sizeof(a))
using namespace std;
const int INF &#61; 0x3f3f3f3f;
struct node
{int x,y,step;node (){}node(int p_x,int p_y,int p_step){x &#61; p_x;y &#61; p_y;step &#61; p_step;}
};
int dir[9][2] &#61; {1,0,0,1,-1,0,0,-1,1,1,1,-1,-1,-1,-1,1};
int n,m;
int mark[305][305];
template
T RandomData(T a, T b,T c)
{if(c <&#61; b ){return rand() % (b - a &#43; 1) &#43; a;}else {T temp;while(true){temp &#61; rand() % (b - a &#43; 1) &#43; a;if(temp !&#61; c){return temp;}}}
}
int main()
{freopen("input0.in","r",stdin);freopen("output2.out","w",stdout);int a,b,c,d;scanf("%d %d %d %d",&a,&b,&c,&d);queue que;que.push(node(a,b,0));int res &#61; 0;while(!que.empty()){node fro &#61; que.front();if(fro.x &#61;&#61; c && fro.y &#61;&#61; d){res &#61; fro.step;break;}que.pop();for(int i &#61; 0; i <8; i&#43;&#43;){int tx &#61; fro.x &#43; dir[i][0];int ty &#61; fro.y &#43; dir[i][1];if(tx >&#61; -100 && tx <&#61; 100 && ty >&#61; -100 && ty <&#61; 100 && mark[tx&#43;105][ty&#43;105] &#61;&#61; 0){mark[tx &#43; 105][ty &#43; 105] &#61; 1;que.push(node(tx,ty,fro.step &#43; 1));}}}printf("%d\n",res);fclose(stdin);fclose(stdout);return 0;
}

可以看到&#xff0c;两份代码都是通过input0.in输入数据的&#xff0c;这里的input0.in的数据我们可以通过第3步的随机数据来获得。然后错误

代码的数据输出到output1.out里面&#xff0c;正确代码的数据输出到output2.out里面。

3.我们需要造出随机数据来作为正确代码和错误代码的输入&#xff0c;然后对别两份代码的输出文件进行寻找错误数据

如下&#xff1a;

//03.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 int INF &#61; 0x3f3f3f3f;
mt19937 rng; //声明一个随机生成器 template
T RandomData(T a, T b,T c)
{uniform_int_distribution dist6(a, b); //指定范围 if(c > b){return dist6(rng);}else {T temp;while(true){temp &#61; dist6(rng);if(temp !&#61; c){return temp;}}}}void makeData()
{FILE* fp&#61;fopen("input0.in","w");int a &#61; RandomData(-100,100,INF);int b &#61; RandomData(-100,100,INF);int c &#61; RandomData(-100,100,INF);int d &#61; RandomData(-100,100,INF);fprintf(fp,"%d %d %d %d\n",a,b,c,d);printf("%d %d %d %d\n",a,b,c,d); fclose(fp);
}
int main()
{rng.seed(time(0)); //将时间作为随机生成器随机种子 for(int i &#61; 1; i <500; i&#43;&#43;){makeData();system("01.exe");system("02.exe");printf("Number:%d\n",i);if(system("fc output1.out output2.out")){printf("Wrong Asnwer\n");while(1); //使程序暂停1毫秒 } }return 0;
}

该代码会造出499组数据用来通过验证两个输出文件的差异来寻找bug;

当有差异的话该程序会自动停下并输出有差异的数据

请注意03.cpp中的53行代码和63行代码&#xff0c;47行是为了给随机函数通过当前时间设置一个随机种子&#xff0c;57行是通过使程序“休眠”

1毫秒使得随机种子起作用。

 

 

注意&#xff0c;在运行03.cpp之前&#xff0c;必须保证

1.三个cpp文件必须在同一文件夹下

2.01.cpp和02.cpp必须通过编译

如果想要生成小数的话&#xff0c;随机函数应该这样写

//03.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 &#61; 0x3f3f3f3f;
std::mt19937 rng; //声明一个随机生成器 template
T RandomData(T a, T b,T c)
{uniform_real_distribution dist6(a, b); //指定范围 if(c <&#61; b){return dist6(rng);}else {T temp;while(true){temp &#61; dist6(rng);if(temp !&#61; c){return temp;}}}}int main()
{rng.seed(time(0));while(true){printf("%lf\n",RandomData(-10.0,25.0,INF));}return 0;
}

如果想生成随机字符应该这样写

//03.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 &#61; 0x3f3f3f3f;
std::mt19937 rng; //声明一个随机生成器 template
T RandomData(T a, T b,T c)
{uniform_int_distribution dist6(a, b); //指定范围 if(c <&#61; b){return dist6(rng);}else {T temp;while(true){temp &#61; dist6(rng);if(temp !&#61; c){return temp;}}}}int main()
{rng.seed(time(0));while(true){printf("%c",RandomData(&#39;a&#39;,&#39;y&#39;,&#39;c&#39;));}return 0;
}


推荐阅读
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • 设计模式——模板方法模式的应用和优缺点
    本文介绍了设计模式中的模板方法模式,包括其定义、应用、优点、缺点和使用场景。模板方法模式是一种基于继承的代码复用技术,通过将复杂流程的实现步骤封装在基本方法中,并在抽象父类中定义模板方法的执行次序,子类可以覆盖某些步骤,实现相同的算法框架的不同功能。该模式在软件开发中具有广泛的应用价值。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
author-avatar
门板班不查询只
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有