acm数据制造

99封情书 提交于 2020-02-10 17:13:20

多组数据比较好构造的

我们可以写一个输入的构造器,我们这里用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;
}
View Code

那我们可以先写个数据的制造器,比如我要制造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;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!