zoj 1940 Dungeon Master(BFS)

16 篇文章 0 订阅

三维的,思路和以前的是一样的,不过最初没注意到head和rear没初始化,SF了好几次(我以为是数组开小了呢,一直开大100W都还是错,后来才发现。。。。。。)

那个用循环来控制情况的方法用着很爽,6种情况弄个循环搞定,呵呵,不错不错。。。

#include<stdio.h>
#include<string.h>
typedef struct 
{  
    int s1[1000000];
    int s2[1000000];
    int s3[1000000];
}queue;
queue que;
int head,rear;
void In(int x,int y,int z)
{
    que.s1[rear]=x;
    que.s2[rear]=y;
    que.s3[rear]=z;
    rear++;
}
void Out(int *x,int *y,int *z)
{
    *x=que.s1[head];
    *y=que.s2[head];
    *z=que.s3[head];
    head++;
}
int isEmpty()
{
    if(head==rear)
      return 1;
    else
      return 0;
}         
int main()
{
    int i,j,k,v1,v2,v3,x1,y1,z1,x2,y2,z2,p1,p2,p3,m,temp;
    int count[35][35][35],sta[35][35][35];
    int t1[6]={0,0,0,0,1,-1};
    int t2[6]={1,-1,0,0,0,0};
    int t3[6]={0,0,1,-1,0,0};
    char a[35][35][35];
    scanf("%d%d%d",&v1,&v2,&v3);
    while(!(v1==0&&v2==0&&v3==0))
    {
       getchar();
       for(i=0;i<v1;i++)
       {
            for(j=0;j<v2;j++)
            {
                for(k=0;k<v3;k++)
                {
                  scanf("%c",&a[i][j][k]);
                  sta[i][j][k]=0;
                  count[i][j][k]=0;
                  if(a[i][j][k]=='S')
                  {
                        x1=i,y1=j,z1=k;
                  }
                  if(a[i][j][k]=='E')
                  {
                        x2=i,y2=j,z2=k;
                  }
                }        
                getchar();
            }
            getchar();
      }    
      head=rear=0;
      In(x1,y1,z1);  
      sta[x1][y1][z1]=1;
      temp=1;
      while(!isEmpty()&&temp)
      {
            Out(&p1,&p2,&p3);
            for(m=0;m<6;m++)
            {
                i=p1+t1[m],j=p2+t2[m],k=p3+t3[m];
                if(i>=0&&i<v1&&j>=0&&j<v2&&k>=0&&k<v3&&a[i][j][k]!='#'&&sta[i][j][k]==0)
                {
                    count[i][j][k]=count[p1][p2][p3]+1;
                    sta[i][j][k]=1;
                    if(a[i][j][k]=='E')
                    {
                        printf("Escaped in %d minute(s).\n",count[i][j][k]);
                        temp=0;
                        break;
                    }
                    else
                      In(i,j,k);
                }
            }
     }
     if(temp)
        printf("Trapped!\n");
     scanf("%d%d%d",&v1,&v2,&v3);
   }
     return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值