zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/BobHuang/p/12291438.html
Copyright © 2011-2022 走看看