多组数据比较好构造的
我们可以写一个输入的构造器,我们这里用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
