zoukankan      html  css  js  c++  java
  • ACM对拍造数据

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1253

    四个程序:

    错误程序

    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int maxn=60;
    int mp[maxn][maxn][maxn];
    int st[maxn][maxn][maxn];
    //int f[6][3]= {{1,0,0},{0,1,0},{-1,0,0},{0,-1,0},{0,0,1},{0,0,-1}};
    int tx[] = {1,-1,0,0,0,0};  
    int ty[] = {0,0,1,-1,0,0};  
    int tz[] = {0,0,0,0,1,-1};  
    int t,T,n,a,b,c,flag;
    int abs(int x){
        return x>=0?x:-x;
    }
    struct Node  
    {  
        int x,y,z,step;  
    };  
    queue<Node >Q;
    void bfs(int x,int y,int z) {
        Node p,q;
        if(!Q.empty()) Q.pop(); 
        p.x=x;
        p.y=y;
        p.z=z;
        p.step=0;
        mp[x][y][z]=1;
        Q.push(p);
        while(!Q.empty()) {
            p=Q.front();
            Q.pop();
            for(int i=0; i<6; i++) {
                q=p;
                q.x+=tx[i];  
                q.y+=ty[i];  
                q.z+=tz[i]; 
                if(q.x<0||q.y<0||q.z<0||q.x>=a||q.y>=b||q.z>=c||mp[q.x][q.y][q.z]==1) {
                    continue;
                }
                q.step++;
                if(q.x==a-1&&q.y==b-1&&q.z==c-1&&q.step<=t) {
                    flag=1;
                    t=q.step;
                    break;
                }
                mp[q.x][q.y][q.z]=1;
                if(abs(q.x-a+1)+abs(q.y-b+1)+abs(q.z-c+1)+q.step>t+2)//由于行走只能朝6个固定方向,这里是对剩下时间里能否走到出口进行预判,如果走最短路径依然不能再规定时间内到达出口,明显是不行的,当然不加这个判断也能AC,只是比较消耗时间  
                    continue;  
                Q.push(q);
            }
            if(flag)break;
        }
    }
    int main() {
    	freopen("1.txt","r",stdin);//读入数据
        freopen("1.out","w",stdout); //输出数据
        scanf("%d",&T);
        while(T--) {
            flag=0;
            memset(mp,0,sizeof(mp));
            scanf("%d%d%d%d",&a,&b,&c,&t);
            for(int i=0; i<a; i++) {
                for(int j=0; j<b; j++) {
                    for(int k=0; k<c; k++) {
                        scanf("%d",&mp[i][j][k]);
                    }
                }
            }
            memset(st,0,sizeof(st));
        if(a+b+c==3){
                printf("0
    ");
                continue;
            }
            bfs(0,0,0);
            if(flag) {
                printf("%d
    ",t);
            } else {
                printf("-1
    ");
            }
        }
    }

    网上的标程

    #include <stdio.h>  
    #include <string.h>  
    #include <queue>  
    using namespace std;  
    const int N = 55;  
      
    int map[N][N][N];  
    int vis[N][N][N];  
    int tx[] = {1,-1,0,0,0,0};  
    int ty[] = {0,0,1,-1,0,0};  
    int tz[] = {0,0,0,0,1,-1};  
    int a,b,c,t,ans;  
      
    struct Node  
    {  
        int x,y,z,step;  
    };  
      
    int abs(int x)//绝对值  
    {  
        return x<0?-x:x;  
    }  
      
    int check(int i,int j,int k)//判断是否可行  
    {  
        if(i<0 || j<0 || k<0 || i>=a || j>=b || k>=c || map[i][j][k])  
        return 0;  
        return 1;  
    }  
      
    int bfs(int x,int y,int z)  
    {  
        int i;  
        queue<Node> Q;  
        Node p,q;  
        p.x = x;  
        p.y = y;  
        p.z = z;  
        p.step = 0;  
        vis[x][y][z] = 1;  
        Q.push(p);  
        while(!Q.empty())  
        {  
            p = Q.front();  
            Q.pop();  
            if(p.x == a-1 && p.y == b-1 && p.z==c-1 && p.step<=t)  
            return p.step;  
            for(i = 0;i<6;i++)  
            {  
                q = p;  
                q.x+=tx[i];  
                q.y+=ty[i];  
                q.z+=tz[i];  
                if(!vis[q.x][q.y][q.z] && check(q.x,q.y,q.z))  
                {  
                    q.step++;  
                    vis[q.x][q.y][q.z] = 1;  
                    if(abs(q.x-a+1)+abs(q.y-b+1)+abs(q.z-c+1)+q.step>t)//由于行走只能朝6个固定方向,这里是对剩下时间里能否走到出口进行预判,如果走最短路径依然不能再规定时间内到达出口,明显是不行的,当然不加这个判断也能AC,只是比较消耗时间  
                    continue;  
                    Q.push(q);  
                }  
            }  
        }  
        return -1;  
    }  
      
    int main()  
    {   freopen("1.txt","r",stdin);//读入数据
        freopen("2.out","w",stdout); //输出数据
        int cas;  
        scanf("%d",&cas);  
        while(cas--)  
        {  
            int i,j,k;  
            scanf("%d%d%d%d",&a,&b,&c,&t);  
            memset(map,0,sizeof(map));  
            memset(vis,0,sizeof(vis));  
            for(i = 0;i<a;i++)  
            for(j = 0;j<b;j++)  
            for(k = 0;k<c;k++)  
            scanf("%d",&map[i][j][k]);  
            ans = bfs(0,0,0);  
            printf("%d
    ",ans);  
        }  
      
        return 0;  
    }  

    造数据的程序:

    #include<iostream>
    #include<cstdlib>
    #include<ctime>
    #define random(a,b) (rand()%(b-a+1)+a)
    using namespace std;
    int a,b,c,t,p;
    int main()
    {
    	freopen("1.txt","w",stdout);//输出文件
        srand((unsigned)time(NULL));//数据随机化时间种子
        p=random(1,10);
        printf("%d
    ",p);
        for(int q=1;q<=p;q++)
        {
        a=random(1,10);b=random(1,10);c=random(1,10);t=random(1,100);
        printf("%d %d %d %d
    ",a,b,c,t);
        for(int i=1;i<=a;i++)
          for(int j=1;j<=b;j++)
             {
             for(int k=1;k<=c;k++)  printf("%d ",random(0,1));
             printf("
    ");
             }
        }
        return 0;
    }

    .bat文件

    :loop  //标签
    3 //打开造数据的eve
    1 //打开1.exe
    2 //打开2.exe
    fc 1.out 2.out  //比较两个out  
    if errorlevel==1 pause  //如果不相等就停止
    goto loop //继续循环

    结果:





    出错误了




    最后发现是Q队列没有清空

    风在前,无惧!
  • 相关阅读:
    java实现报数游戏
    java实现取字母组成串
    java实现取字母组成串
    java实现取字母组成串
    java实现取字母组成串
    java实现取字母组成串
    java实现填写算式
    java实现填写算式
    java实现填写算式
    java实现填写算式
  • 原文地址:https://www.cnblogs.com/The-Pines-of-Star/p/9878835.html
Copyright © 2011-2022 走看看