首页 > 其他分享 >hdu1240 Asteroids! (三维BFS)

hdu1240 Asteroids! (三维BFS)

时间:2024-02-03 16:33:41浏览次数:21  
标签:20 room vis Asteroids cin BFS start && hdu1240

Problem - 1240 (hdu.edu.cn)

三维的BFS,存在一个坐标点的变换,即输入的是 (y , z , x),进行转换即可

#include<iostream> 
#include<queue>
#include<cstring>
using namespace std;
int n,x1,y1,z1,x2,y2,z2,flag,vis[20][20][20];
char room[20][20][20];
struct node{
    int x,y,z,step;
};
#define CHECK(x,y,z) (x>=0&&x<n&&y>=0&&y<n&&z>=0&&z<n)
int dir[6][3]={{1,0,0},{-1,0,0},{0,1,0},{0,-1,0},{0,0,1},{0,0,-1}};
void BFS(){
    queue<node> q;
    node start,next;
    start.x=x1;
    start.y=y1;
    start.z=z1;
    start.step=0;
    q.push(start);
    flag=0;
    while(!q.empty()){
        start=q.front();
        q.pop();
        if(start.x==x2 && start.y==y2 && start.z==z2){
            cout<<n<<" "<<start.step<<endl;
            flag=1;
            break;
        }
        for(int i=0;i<6;i++){
            next.x=start.x+dir[i][0];
            next.y=start.y+dir[i][1];
            next.z=start.z+dir[i][2];
            if(CHECK(next.x,next.y,next.z) && vis[next.x][next.y][next.z]!=-1){
                vis[next.x][next.y][next.z]=-1;
                next.step=start.step+1;
                q.push(next);
            }
        }    
    }
    if(!flag) cout<<"NO ROUTE"<<endl;
}
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    string s;
    while(cin>>s){
        cin>>n;
        memset(vis,0,sizeof(vis));
        memset(room,0,sizeof(room));
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                for(int k=0;k<n;k++){
                    cin>>room[i][j][k];
                    if(room[i][j][k]=='X') vis[i][j][k]=-1;
                }
            }
        }
        cin>>y1>>z1>>x1;
        cin>>y2>>z2>>x2;
        cin>>s;
        BFS();
    }
    return 0;
}

 

标签:20,room,vis,Asteroids,cin,BFS,start,&&,hdu1240
From: https://www.cnblogs.com/accbulb/p/18004894

相关文章

  • Poj 3414 Pots (BFS+回溯+队列)
    这道题需要输出最后结果的执行过程,可以通过结构体,在结构体中定义一个数组s,s中存储了每一步的执行过程,实现了回溯。并且在运行中可以适当剪枝,减少枚举次数。 #include<iostream>#include<queue>#include<cstring>usingnamespacestd;constintN=110;intaa,bb,cc,vis[N......
  • Poj 3278 Catch That Cow (BFS+队列)
    #include<iostream>#include<queue>#include<cstring>usingnamespacestd;constintN=1e5+10;intn,k,line[N],way;structnode{intloc,step;};queue<node>q;voidBFS(intn,intk){while(!q.empty())q.pop();nodestart,next......
  • Poj3126 Prime Path (BFS+筛素数)
    #include<iostream>#include<queue>#include<cstring>constintN=10010;intt,aa,bb,prime[N],vis[N],step[N];usingnamespacestd;voidprime_(){//埃式筛法prime[0]=prime[1]=1;for(inti=2;i<10000;i++){if(prime[i])contin......
  • 状压+BFS
    洛谷2622思路定义一个结构体节点,分别存储状态和步骤,状态的某一位是1表示灯开着,是0则表示该灯关,当状态为0000时输出的步骤即为最小步骤。点击查看代码#include<bits/stdc++.h>usingnamespacestd;//#defineintlonglong#definelllonglonginta[120][102]={0};int......
  • leetcode--98. 验证二叉搜索树(bfs)
    记录13:502024-1-28https://leetcode.cn/problems/validate-binary-search-tree/想岔方向了,想的太复杂了。首先思路是每个root节点必须大于左子树的最大节点,小于右边子树的最小节点。我的做法是记录下叶子节点,因为左边叶子节点的集合(vector)的最后一个节点为左子树的最大值......
  • POJ2627 数独 (dfs or bfs)
    POJ2627数独(dfsorbfs)给出一个数独,空白用0表示,输出一个合理答案即可;SampleInput1103000509002109400000704000300502006060000050700803004000401000009205800804000107SampleOutput1436285795721394689867542313915427864689173527258639142374816956......
  • 搜索学习笔记+杂题 (进阶二 dfs/bfs的进阶)
    前言:由于搜索的题还是做的太少了,所以以后有可能会不定期更新。四、还是进阶的dfs/bfs相关题单:戳我1、dfs(1)meetinthemiddleP2962[USACO09NOV]LightsG颠覆了我对折半搜索的认知,果然,只要满足了折半搜索的几个性质,基本上都可以使用折半搜索来处理。首先我们拿到的是一张......
  • 搜索学习笔记+杂题 (进阶一 dfs/bfs的进阶)
    前言:没啥好说的了。所以只能来写博客了。搜索杂题:相关题单:戳我二、进阶dfs/bfs1、dfs进阶——折半搜索(meetinthemiddle)由于深搜的时间复杂度在每种状态有两个分支的情况下是\(O(2^n)\)。所以一般暴力深搜的数据范围就在\(20-25\)之间。而对于有一大类的题,它的搜索思......
  • 搜索学习笔记+杂题 (基础二 dfs/bfs的拓展)
    搜索杂题:博客中讲述的题的题单:戳我二、dfs/bfs的各种变式1、深搜深搜以指数级的时间复杂度闻名,稍不注意时间就会爆炸,所以一般会用到剪枝的技巧(这个技巧基本上是因题而异,需要平时的刷题与积累)。深搜同样也是一种可变性极高的算法(其实都可以不叫做一种算法,深搜已经是一种做题的......
  • BFS-走迷宫
    1.题目简单概述:走迷宫问题,行走的方向是上下左右。这个迷宫内有些格子不能走,想要从迷宫的左上角走到右下角,最少移动次数。这道题属于最短路问题(求出到达一个点的最短路径)。思路分析为什么使用BFS求到的答案能保证是最短的路径?因为BFS是逐层搜索的,能把当前层的所有可能值包......