多组数据比较好构造的
我们可以写一个输入的构造器,我们这里用TZOJ2624: 避雨举例
我们可以先写好如下标程
#include <string.h> #include <stdio.h> char str[15][15]; int main() { int t, n, m, i, j, sX, sY; int min, ansX, ansY, tmp; scanf("%d", &t); while (t--) { scanf("%d%d", &m, &n); for (i = 0; i < m; i++) { scanf("%s", str[i]); for (j = 0; j < n; j++) if (str[i][j] == 's') { sX = i; sY = j; } } min = 100000; for (i = 0; i < m; i++) for (j = 0; j < n; j++) { if (str[i][j] == 'd') { tmp = (i - sX)*(i - sX) + (j - sY)*(j - sY); if (min > tmp) { min = tmp; ansX = i; ansY = j; } } } printf("(%d,%d)\n", ansX, ansY); } return 0; }
那我们可以先写个数据的制造器,比如我要制造50组数据
#include<bits/stdc++.h> using namespace std; int main() { //所有会被存储到当前文件夹下的data1.in文件下 freopen("data1.in","w",stdout); srand(time(NULL)); int T=50; cout<<T<<"\n"; while(T) { //m和n都是[1,9],rand%9是[0,8],+1就是了 int n=rand()%9+1,m=rand()%9+1; //flag用来标记只出现一个s int flag=0; string a[11]; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { //x的值为[0,2] int x=rand()%3; //随机出2就是s,但是只能有一个 if(x==1) a[i]+="d"; else if(x==2&&flag==0) a[i]+="s",flag=1; else a[i]+="."; } } //用来检验是否合法 int flag1=0,flag2=0; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]=='s') { flag1++; } if(a[i][j]=='d') { flag2++; } } } //'s'只能有一个,d存在 if(flag1==1&&flag2) { //输出当前的n和m以及当前构造的数据 cout<<n<<" "<<m<<"\n"; for(int i=0;i<n;i++) a[i][m]=0,cout<<a[i]<<"\n"; //成功了就可以少构造一组了 T--; } } return 0; }
那我们的代码加两行
freopen("data1.in","r",stdin); freopen("data1.out","w",stdout);
新的代码如下
#include <bits/stdc++.h> using namespace std; int main() { freopen("data1.in","r",stdin); freopen("data1.out","w",stdout); int t; cin>>t; while(t--) { int n,m,sx,sy,smin=0x3f3f3f3f,dx,dy; char a[11][11]; cin>>n>>m; for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { cin>>a[i][j]; if(a[i][j]=='s') { sx=i; sy=j; } } } for(int i=0;i<n;i++) { for(int j=0;j<m;j++) { if(a[i][j]=='d'&&(i-sx)*(i-sx)+(j-sy)*(j-sy)<smin) { smin=(i-sx)*(i-sx)+(j-sy)*(j-sy); dx=i; dy=j; } } } cout<<"("<<dx<<","<<dy<<")"<<endl; } return 0; }
来源:https://www.cnblogs.com/BobHuang/p/12291438.html