HDU-1240,Asteroids!(BFS)

简介: HDU-1240,Asteroids!(BFS)

Problem Description:


You're in space.

You want to get home.

There are asteroids.

You don't want to hit them.


Input:


Input to this problem will consist of a (non-empty) series of up to 100 data sets. Each data set will be formatted according to the following description, and there will be no blank lines separating data sets.


A single data set has 5 components:


Start line - A single line, "START N", where 1 <= N <= 10.


Slice list - A series of N slices. Each slice is an N x N matrix representing a horizontal slice through the asteroid field. Each position in the matrix will be one of two values:


'O' - (the letter "oh") Empty space


'X' - (upper-case) Asteroid present


Starting Position - A single line, "A B C", denoting the <A,B,C> coordinates of your craft's starting position. The coordinate values will be integers separated by individual spaces.


Target Position - A single line, "D E F", denoting the <D,E,F> coordinates of your target's position. The coordinate values will be integers separated by individual spaces.


End line - A single line, "END"


The origin of the coordinate system is <0,0,0>. Therefore, each component of each coordinate vector will be an integer between 0 and N-1, inclusive.


The first coordinate in a set indicates the column. Left column = 0.


The second coordinate in a set indicates the row. Top row = 0.


The third coordinate in a set indicates the slice. First slice = 0.


Both the Starting Position and the Target Position will be in empty space.


Output:


For each data set, there will be exactly one output set, and there will be no blank lines separating output sets.


A single output set consists of a single line. If a route exists, the line will be in the format "X Y", where X is the same as N from the corresponding input data set and Y is the least number of moves necessary to get your ship from the starting position to the target position. If there is no route from the starting position to the target position, the line will be "NO ROUTE" instead.


A move can only be in one of the six basic directions: up, down, left, right, forward, back. Phrased more precisely, a move will either increment or decrement a single component of your current position vector by 1.


Sample Input:


START 1


O


0 0 0


0 0 0


END


START 3


XXX


XXX


XXX


OOO


OOO


OOO


XXX


XXX


XXX


0 0 1


2 2 1


END


START 5


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


XXXXX


XXXXX


XXXXX


XXXXX


XXXXX


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


OOOOO


0 0 0


4 4 4


END


Sample Output:


1 0


3 4


NO ROUTE


解题思路:


这道题与胜利大逃亡相似,一共有六个方向,也是一个三维的BFS,进行好细节的判断就可以了!


程序代码:


#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
struct node
{
  int x,y,z,step;
};
char str[11],map[101][101][101];
int n,sx,sy,sz,ex,ey,ez,vis[101][101][101];
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
void bfs()
{
  int i,ans,flag=0;
  queue<node> q;
  node p,m;
  p.x=sx;
  p.y=sy;
  p.z=sz;
  p.step=0;
  q.push(p);
  vis[sx][sy][sz]=1;
  map[sx][sy][sz]='X';
  map[ex][ey][ez]='O';
  while(!q.empty())
  {
    p=q.front();
    q.pop();
    if(p.x==ex&&p.y==ey&&p.z==ez)
    {
      flag=1;
      ans=p.step;
      break;
    }
    for(i=0;i<6;i++)
    {
      m.x=p.x+dir[i][0];
      m.y=p.y+dir[i][1];
      m.z=p.z+dir[i][2];
      if(m.x>=0&&m.x<n&&m.y>=0&&m.y<n&&m.z>=0&&m.z<n
        &&!vis[m.x][m.y][m.z]&&map[m.x][m.y][m.z]=='O')
      {
        m.step=p.step+1;
        map[m.x][m.y][m.z]='X';
        vis[m.x][m.y][m.z]=1;
        q.push(m);  
      }
    }
  }
  if(flag)
    cout<<n<<" "<<ans<<endl;
  else
    cout<<"NO ROUTE"<<endl;
}
int main()
{
  while(scanf("%s%d",str,&n)!=EOF)
  {
    memset(vis,0,sizeof(vis));
    for(int i=0;i<n;i++)
      for(int j=0;j<n;j++)
        for(int k=0;k<n;k++)
          cin>>map[i][j][k];
    cin>>sx>>sy>>sz>>ex>>ey>>ez;
    cin>>str;
    bfs();
  }
  return 0;
}

 


相关文章
|
8月前
|
Ubuntu 安全 Linux
ubuntu2404 Server扩展PV
通过以上步骤,你可以成功扩展Ubuntu 24.04 Server上的物理卷。该过程包括创建新分区、将其添加到现有PV、扩展逻辑卷和相应的文件系统。扩展完成后,服务器将能够使用新增的存储空间,确保系统运行更加高效和稳定。
294 77
|
8月前
|
负载均衡 数据中心 芯片
NSDI'24 | 阿里云飞天洛神云网络论文解读——《LuoShen》揭秘新型融合网关 洛神云网关
NSDI'24 | 阿里云飞天洛神云网络论文解读——《LuoShen》揭秘新型融合网关 洛神云网关
245 0
|
12月前
|
Java Shell Apache
Jmeter快速入门
Jmeter快速入门
119 1
Jmeter快速入门
|
12月前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
机器学习/深度学习 监控 安全
现货量化合约跟单/交易所系统开发成熟技术/案例搭建/玩法详情/步骤指南
现货量化合约跟单系统开发是指构建一个系统,通过使用量化交易策略,实现将现货市场的交易信号自动化地应用到交易合约中,以进行自动化的跟单交易。 以下是现货量化合约跟单系统开发的关键概述:
|
存储 API Python
python之代理ip的配置与调试
python之代理ip的配置与调试
316 7
|
iOS开发 MacOS
Qt 报错:Undefined symbols for architecture arm64
MacBook Pro Apple M1 使用 Qt 6.4.1 的时候碰到的报错,做了不同的尝试,最后解决了这个报错。
875 0
|
机器学习/深度学习
深度学习入门基础CNN系列——填充(padding)与步幅(stride)
深度学习入门基础之填充和步幅相关知识点~
深度学习入门基础CNN系列——填充(padding)与步幅(stride)
下一篇
开通oss服务