• acm数据制造


    多组数据比较好构造的

    我们可以写一个输入的构造器,我们这里用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)
    ", 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<<"
    ";
        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<<"
    ";
                for(int i=0;i<n;i++)
                a[i][m]=0,cout<<a[i]<<"
    ";
                //成功了就可以少构造一组了
                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;
    }

    随机

    #include <bits/stdc++.h>
    using namespace std;
    int main()
    {
        //把时间作为随机数种子,没有这一步你的随机是假的
        srand(time(NULL));
        //可以生成[1000,10000)的一个整数
        int n=0;
        while(n<=1000)
        {
            n=rand()%10000;
        }
        //显然上面这个效率很差,特别是区间很小的话,你可以随机一个[0,9000)的数+1000就好了
        n=rand()%9000+1000;
        cout<<n<<"
    ";
    }
    View Code
  • 相关阅读:
    微信分享相关
    移动端界面适配
    MongoDB安装使用
    MongoDB可视化工具RoboMongo
    PhotoSwipe图片展示插件
    BootStrap下拉框搜索功能
    Node.js 特点
    原生node实现本地静态页面的展示
    阿里巴巴电话初面
    react动态添加多个输入框
  • 原文地址:https://www.cnblogs.com/BobHuang/p/12291438.html
Copyright © 2020-2023  润新知