HDOJ 胜利大逃亡

                                              胜利大逃亡

                原题连接:http://acm.hdu.edu.cn/showproblem.php?pid=1253

思路:利用bfs进行广搜,不过最让人蛋疼的是起点可以是墙,出点也可能为墙,觉得这样出题没什么意思,虽然坑了像我这样的菜鸟。。。自己用c写了一个,不过一直错了将近20多次,后来又自学了stl的队列,一下就过了。。。。

利用stl的queue队列写的AC代码:

#include<queue>
#include <iostream>
#include"cstring"
#include"cstdio"
using namespace std;
int map[51][51][51],v[51][51][51],newx[6]={0,0,0,0,-1,1},newy[6]={-1,0,1,0,0,0},newz[6]={0,-1,0,1,0,0};

typedef struct node
{
    int x,y,z;
    int step;
}chao;

void bfs(int x,int y,int z,int t)
{
    node from,to;
    queue <chao> q;

     from.x=from.y=from.z=from.step=0;

     memset(v,0,sizeof(v));

      q.push(from);
      v[0][0][0]=1;
      while(!q.empty())
      {
          from=q.front();
          q.pop();

          if(from.step>t)//||(x-from.x+y-from.y+z-from.z-3)>t)
            break;

          if(from.x==x-1&&from.y==y-1&&from.z==z-1)
            {
                printf("%d\n",from.step);
                return ;
            }

          for(int i=0;i<6;i++)
          {
              to.x=from.x+newx[i];
              to.y=from.y+newy[i];
              to.z=from.z+newz[i];
              if(to.x>=0&&to.x<x&&to.y>=0&&to.y<y&&to.z>=0&&to.z<z&&!map[to.x][to.y][to.z]&&!v[to.x][to.y][to.z])
                  {
                      to.step=from.step+1;
                      q.push(to);
                      v[to.x][to.y][to.z]=1;
                  }
          }
      }
         printf("-1\n");
}

int main()
{
    int x,y,z,i,j,k,t,n;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d%d%d%d",&x,&y,&z,&t);
        for(i=0;i<x;i++)
          for(j=0;j<y;j++)
            for(k=0;k<z;k++)
               scanf("%d",&map[i][j][k]);

            if(map[x-1][y-1][z-1]==1||x+y+z-3>t)//剪枝,x+y+z-3为假设可以到达出口的最小步数,如果连它都大于那就。。。
                printf("-1\n");
            else
                bfs(x,y,z,t);
    }

    return 0;
}


以下是自己用c写的错误代码,恳请大牛们指点哪里出错了:

#include"stdio.h"
#include"string.h"
int map[53][53][53],i,j,k,n,x,y,z,t,step[125010],q1[125010],q2[125010],q3[125010];
int v[53][53][53],flat,x2,y2,z2,newx[6]={0,0,0,0,-1,1},newy[6]={-1,0,1,0,0,0},newz[6]={0,-1,0,1,0,0};
int main()
{
    int x1,y1,z1,to,from;
       scanf("%d",&n);
       while(n--)
       {
           flat=0;
           scanf("%d%d%d%d",&x2,&y2,&z2,&t);
            memset(step,0,sizeof(step));
            memset(v,0,sizeof(v));

           for(i=0;i<x2;i++)
            for(j=0;j<y2;j++)
              for(k=0;k<z2;k++)
                scanf("%d",&map[i][j][k]);

      if(map[x2-1][y2-1][z2-1]==1||map[0][0][0]==1||x2+y2+z2-3>t)
             flat=0;
     else
     {
            from=0;to=0;
            q1[to]=q2[to]=q3[to++]=0;
            while(from<to)
            {
                x=q1[from];
                y=q2[from];
                z=q3[from++];
                v[x][y][z]=1;
                if(step[from-1]>t)
                      break;
                if(x==x2-1&&y==y2-1&&z==z2-1)
                    {
                        flat=1;
                        printf("%d\n",step[from-1]);
                        break;
                    }
                for(k=0;k<6;k++)
                 {
                     x1=newx[k]+x;
                     y1=newy[k]+y;
                     z1=newz[k]+z;

                     if(x1>=0&&x1<x2&&y1>=0&&y1<y2&&z1>=0&&z1<z2&&!map[x1][y1][z1]&&!v[x1][y1][z1])
                          {
                              step[to]=step[from-1]+1;
                              q1[to]=x1;
                              q2[to]=y1;
                              q3[to++]=z1;
                          }
                 }
            }
     }
          if(!flat)
             printf("-1\n");
       }

    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值