回到主页

如何简单地设计模拟试题的测试数据

陈鸥辉

· C语言,图形化编程,教育有感

题目描述

有许多蚂蚁在一根无限长的木棍上,每一只蚂蚁都有一个初始位置和初始朝向(任意两只蚂蚁的初始位置不同)。蚂蚁们以每秒一个单位的速度向前移动,当两只蚂蚁相遇时,它们会掉头(掉头时间忽略不计)。现给出每只蚂蚁的初始位置和初始朝向,请你计算出它们在t秒后的位置和朝向。

输入格式

第一行,两个空格隔开的整数n,t(代表蚂蚁数n和时间t)

第2~n+1行每行两个整数,第i+1行代表第i只蚂蚁的初始位置ai(ai的绝对值在1000000以内)及初始朝向bi(bi=1时蚂蚁朝右,bi=-1时蚂蚁朝左)

输出格式

n行,每行两个整数,第i行代表t秒后第i只蚂蚁的位置及朝向(-1表示朝左,1表示朝右,0表示正在转向中)

输入输出样例

 
broken image

说明/提示

【数据范围】

对于40%的数据,n<=100

对于80%的数据,n<=10000,t<=1000

对于100%的数据,n<=100000,t<=100000

第二步:根据题目要求用随机函数一次生成多个输入数据,代码如下。

​#include <bits/stdc++.h>
using namespace std;
int n,t,w,bi,h[1000001];
char ins[100]="antx.in";
int main() {
  for(int i=0;i<=9;i++){//一次生成10个数据,自己可以修改个数 
    ins[3]=i+48;//输入文件名更改 
    freopen(ins,"w",stdout);
    srand(time(0));
    if(i<4){n=rand()%100+1;t=rand()%100+1;}
    else if(i<8){n=rand()%10000+1;t=rand()%1000+1;}
    else {n=rand()%100000+1;t=rand()%100000+1;}
    cout<<n<<" "<<t<<endl; 
    //生成n个蚂蚁位置数据 
    for(int i=1;i<=n;i++){
      memset(h,0,sizeof(h));//蚂蚁位置不同
      do{
        w=rand()%1000000+1;
      }while(h[w]==1);  
      h[w]=1;//标记位置被一只蚂蚁占领
      if(rand()%2)bi=-1;
      else bi=1;//随机生成朝向 
      cout<<w<<" "<<bi<<endl;//保存位置+朝向 
    }
  }
  fclose(stdout); 
  cout<<"生成完成!"<<endl;    
  return 0;
} 最后一步:复制洛谷上的题解代码,生成输出文件 #include <cstdio>
#include <algorithm>
using namespace std;
const int Tmax=100005;
char ins[100]="antx.in",ous[100]="antx.out";
struct node{int x,d,num;};
node ant[Tmax];
int n,m,position[Tmax];
bool cmp1(const node &a,const node &b){return a.x<b.x;}
int main(){
  for(int x=0;x<=9;x++){//输出10个数据
    ins[3]=ous[3]=x+48;
    freopen(ins,"r",stdin); 
    freopen(ous,"w",stdout); 
    int i;
    scanf("%d %d",&n,&m);
    for(i=1;i<=n;i++){
          scanf("%d %d",&ant[i].x,&ant[i].d);
          ant[i].num=i;
      }
      sort(ant+1,ant+1+n,cmp1);
      for(i=1;i<=n;i++){
          position[ant[i].num]=i;
          ant[i].x+=ant[i].d*m;
      }
      sort(ant+1,ant+1+n,cmp1);
      for(i=1;i<=n;i++)
        if(ant[i].x==ant[i+1].x) ant[i+1].d=ant[i].d=0;
      for(i=1;i<=n;i++)
        printf("%d %d\n",ant[position[i]].x,ant[position[i]].d);
  }    
  return 0;
}
到此为止,测试数据生成完毕,是不是很简单?与其求人,不如求己,有些特例要求自己单个修改几个输入数据再运行生成输入数据即可。掌握了方法,各大网站的习题都是你的模拟测试题库,