Asteroids! (hdu1240)

本文详细解析了Asteroids!(hdu1240)问题的解决方案,通过使用BFS(广度优先搜索)算法在多层迷宫中寻找从起点到终点的最短路径,避免碰撞到障碍物。代码实现涵盖了节点结构定义、状态标记、方向数组设定及BFS核心算法流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Asteroids! (hdu1240)

搜索
Problem Description

You’re in space.
You want to get home.
There are asteroids.
You don’t want to hit them.
题目直链

题解

简单的bfs搜索,多层迷宫类型的题目

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
using namespace std;
typedef long long ll;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
const int maxn = 1e5+5;
struct node
{
   int x,y,z,step;
};
int flag[15][15][15];
char mp[15][14][15];
int d[6][3] = {0,1,0,1,0,0,0,-1,0,-1,0,0,0,0,-1,0,0,1};
int n;
node ed,bg;
int bfs()
{
   queue<node> q;
   q.push(bg);
   if(bg.x==ed.x&&bg.y==ed.y&&bg.z==ed.z)
   {
       return 0;
   }
   while(!q.empty())
   {
       node f = q.front();
       node t;
       q.pop();
       for(int  i=0;i<6;i++)
       {
           
           t.x = f.x + d[i][0];
           t.y = f.y + d[i][1];
           t.z = f.z + d[i][2];
           t.step = f.step+1;
           if(t.x>=0&&t.x<n&&t.y>=0&&t.y<n&&t.z>=0&&t.z<n&&flag[t.z][t.x][t.y]==0&&mp[t.z][t.x][t.y]=='O')
           {
               if(t.x==ed.x&&t.y==ed.y&&t.z==ed.z)
               {
                   return t.step;
               }
               q.push(t);
               flag[t.z][t.x][t.y] = 1;
           }
       }
   }
   return -1;
}
int main()
{
   char s[105];
   while (cin>>s>>n)
   {
       rep(k,0,n)
       rep(i,0,n)
       {
           rep(j,0,n)
           {
               cin>>mp[k][i][j];
           }
       }
       scanf("%d %d %d",&bg.x,&bg.y,&bg.z);
       scanf("%d %d %d",&ed.x,&ed.y,&ed.z);
       bg.step = 0;
       flag[bg.z][bg.x][bg.y] = 1;
       scanf(" %s",s);
       int ans = bfs();
       if(ans!=-1)
           printf("%d %d\n",n,ans);
       else
       {
           printf("NO ROUTE\n");
       }
       
   }
   
   return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值