HDU 1240

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 #include<cstring>
 5 int mmin,n;
 6 using namespace std;
 7 const int qq=11;
 8 char map[qq][qq][qq];
 9 int dx[]={0,0,-1,1,0,0},dy[]={-1,1,0,0,0,0},dz[]={0,0,0,0,1,-1};
10 int tx,ty,tz;
11 void dfs(int sz,int sy,int sx,int cnt)
12 {
13     if(cnt>=mmin)    return;
14     if(sx<0||sy<0||sz<0||sx>=n||sy>=n||sz>=n)    return;
15     if(sz==tz&&sy==ty&&sx==tx){
16         if(cnt<mmin)    mmin=cnt;
17         return;
18     }
19     for(int i=0;i<6;++i){
20         if(map[sz+dz[i]][sy+dy[i]][sx+dx[i]]!=‘X‘){
21             map[sz+dz[i]][sy+dy[i]][sx+dx[i]]=‘X‘;
22             dfs(sz+dz[i],sy+dy[i],sx+dx[i],cnt+1);
23             map[sz+dz[i]][sy+dy[i]][sx+dx[i]]=‘O‘;
24         }
25     }
26     return;
27 }
28 int main()
29 {
30     char s[15];
31     while(scanf("%s %d%*c",s,&n)!=EOF){
32         mmin=1e6;
33         for(int x,y,z=0;z<n;++z)
34             for(y=0;y<n;++y){
35                 for(x=0;x<n;++x){
36                     map[z][y][x]=getchar();
37                 }
38                 getchar();
39             }
40         int sx,sy,sz;
41         scanf("%d %d %d",&sx,&sy,&sz);
42         scanf("%d %d %d",&tx,&ty,&tz);scanf("%s",s);
43         map[sz][sy][sx]=‘X‘;
44         dfs(sz,sy,sx,0);
45         if(mmin==1e6)    printf("NO ROUTE\n");
46         else            printf("%d %d\n",n,mmin);
47     }
48 }

搜索第二题

这是我模仿1010写出来的一段代码,说到底也剪枝了吧... 虽然没什么乱用

上面代码测试到第三组数据就超时了.  主要原因是首先要找到一个解才能起到一个剪枝的效果,如果一开始找到的就是那个最大的解的话,这剪枝也没什么效果了

所以参考了别人的代码    下面的剪枝效果就比较好了,记录出发点到每一点的最小步数.但是先要标记一下

 1 #include<iostream>
 2 #include<cstdlib>
 3 #include<cstdio>
 4 #include<cstring>
 5 int mmin,n;
 6 const int MIN=1e7;
 7 using namespace std;
 8 const int qq=11;
 9 char map[qq][qq][qq];
10 int dis[qq][qq][qq];
11 int dx[]={0,0,-1,1,0,0},dy[]={-1,1,0,0,0,0},dz[]={0,0,0,0,1,-1};
12 int tx,ty,tz;
13 void dfs(int sz,int sy,int sx,int cnt)
14 {
15     if(map[sz][sy][sx]==‘X‘)    return;
16     if(sx<0||sy<0||sz<0||sx>=n||sy>=n||sz>=n)    return;
17     if(sz==tz&&sy==ty&&sx==tx){
18         if(cnt<mmin)    mmin=cnt;
19         return;
20     }
21     if(dis[sz][sy][sx]<=cnt)    return;
22     else                    dis[sz][sy][sx]=cnt;
23     int dxx,dyy,dzz;
24     for(int i=0;i<6;++i){
25         dxx=sx+dx[i];dyy=sy+dy[i];dzz=sz+dz[i];
26         dfs(dzz,dyy,dxx,cnt+1);
27     }
28     return;
29 }
30 int main()
31 {
32     char s[15];
33     while(scanf("%s %d%*c",s,&n)!=EOF){
34         mmin=1e8;
35         for(int x,y,z=0;z<n;++z)
36             for(y=0;y<n;++y){
37                 for(x=0;x<n;++x){
38                     map[z][y][x]=getchar();
39                     dis[z][y][x]=MIN;
40                 }
41                 getchar();
42             }
43         int sx,sy,sz;
44         scanf("%d %d %d",&sx,&sy,&sz);
45         scanf("%d %d %d",&tx,&ty,&tz);
46         scanf("%s",s);
47         dfs(sz,sy,sx,0);
48         if(mmin==1e8)    printf("NO ROUTE\n");
49         else            printf("%d %d\n",n,mmin);
50     }
51 }

继续出发!!!搜索

时间: 2024-11-05 17:30:51

HDU 1240的相关文章

HDU 1240 (简单三维广搜) Asteroids!

给出一个三维的迷宫以及起点和终点,求能否到大终点,若果能输出最短步数 三维的问题无非就是变成了6个搜索方向 最后强调一下xyz的顺序,从输入数据来看,读入的顺序是map[z][x][y] 总之,这是很基础的一道题 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm

hdu 1240:Asteroids!(三维BFS搜索)

Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3159    Accepted Submission(s): 2106 Problem Description You're in space.You want to get home.There are asteroids.You don't want to hit

HDU 1240——Asteroids!(三维BFS)POJ 2225——Asteroids

普通的三维广搜,需要注意的是输入:列,行,层 #include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<algorithm> #define M 11 using namespace std; int dir[6][3]={{0,1,0},{0,-1,0},{1,0,0},{-1,0,0},{0,0,1},{0,0,-1}};//6个方向 int

HDU 1240 Asteroids! (三维BFS)

Asteroids! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4749    Accepted Submission(s): 3048 Problem Description You're in space. You want to get home. There are asteroids. You don't want to

hdu - 1240 Nightmare &amp;&amp; hdu - 1253 胜利大逃亡(bfs)

http://acm.hdu.edu.cn/showproblem.php?pid=1240 开始没仔细看题,看懂了发现就是一个裸的bfs,注意坐标是三维的,然后每次可以扩展出6个方向. 第一维代表在第几层.后两维代表行和列. 1 #include <cstdio> 2 #include <cstring> 3 #include <queue> 4 using namespace std; 5 struct point 6 { 7 int x,y,z,step; 8 b

HDU 1240.Asteroids!

Asteroids! Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u SubmitStatusPracticeHDU 1240 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

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 fo

hdu 1240 3维迷宫 求起点到终点的步数

题意,给出一个N,这是这个三空间的大小,然后给出所有面的状况O为空地,X为墙,再给出起始点的三维坐标和终点的坐标,输出到达的步数 比较坑 z是x,x是y,y是z,Sample InputSTART 1O0 0 00 0 0ENDSTART 3XXXXXXXXXOOOOOOOOOXXXXXXXXX0 0 12 2 1ENDSTART 5OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXOOOOOOO

HDU 1240 Asteroids! 解题报告

//这道题做完我只有 三个感受  第一:坑: 第二 : 坑! 第三:还是坑! 咳咳  言归正传  WA了无数次之后才发现是输入进去时坐标时z, y, x的顺序输入的 题解   :  类似胜利大逃亡 只不过给你了起始坐标和终点坐标, 让你输出到达目标点所需最少步数: 输出时第一个输出时是START读入的map大小值n;第二个是所求步数 //细节: 1.读入:   读入时分别两次%S把没用的START 和 END读取掉: 2.输出时输出 三维坐标大小值n, 以及步数: 3.输入进去时开始点和结束点坐