poj3669 广搜

//好久没刷题了,生疏了。

题意分析:

  题意理解为在一个二维的正向坐标轴上,一个点(流星)连同它的上下左右的四个点会在某一个时刻被破坏。一个人在原点,问她到达安全区的最小时间是多少。

代码思路:  

  从原点开始搜索,如果当前的点是安全的(不会被破坏掉),那么就结束了。不然的话,向四个方向搜索,如果该方向的点没有被搜索过,并且到达该点的时间小于那一点被破坏的最小时间减一,那么就认为该点是可以到达的。记录到达该点的最小时间,把该点入队。

  搜索的之前的处理是这样的。把每个点都设置为安全(永远不会被破坏),该点被破坏的时间为INF。读入数据的时候,对每一个输入,我们对五个点(输入坐标的点和其上下左右的四个点)进行处理:该点会被破坏,每次取该点被破坏的最小时间。

  需要注意的是:虽然输入的坐标范围x,y是[0,300],但是安全点的坐标可能大于300,最大可能是302。我就这样错了一次。

个人的代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<queue>
 5 #include<algorithm>
 6 using namespace std;
 7
 8 const int N = 305,INF=1010;
 9 struct node
10 {
11     int x,y;
12     bool f;//会不会被破坏
13     int t;//被破坏最小时间
14     int s;//走到这里需要的最小时间
15 }p[N][N];
16 bool vis[N][N];
17 int step;
18 bool isin(int x,int y)
19 {
20     return x<=N&&x>=0&&y<=N&&y>=0;
21 }
22 int dx[5]={0,0,0,1,-1};
23 int dy[5]={0,1,-1,0,0};
24 queue<node> q;
25 node p1,p2;
26 void bfs()
27 {
28     int i,j,k;
29     while(!q.empty())
30     {
31         p1=q.front();
32         q.pop();
33         //printf("%d  %d  %d\n",p1.x,p1.y,p1.s);
34         if(p1.f==0) {step=p1.s;break;}
35         for(k=1;k<5;k++)
36         {
37             i=p1.x+dx[k];
38             j=p1.y+dy[k];
39             if(!vis[i][j]&&isin(i,j))
40             {
41                 if(p1.s+1<p[i][j].t)
42                 {
43                     p[i][j].s=p1.s+1;
44                     q.push(p[i][j]);
45                     vis[i][j]=1;
46                 }
47             }
48         }
49     }
50 }
51 int main()
52 {
53     //freopen("test.txt","r",stdin);
54     int m,i,x,y,t,j;
55     while(scanf("%d",&m)!=EOF)
56     {
57         for(i=0;i<N;i++){
58             for(j=0;j<N;j++){
59                 p[i][j].x=i;
60                 p[i][j].y=j;
61                 p[i][j].f=0;
62                 p[i][j].t=INF;
63             }
64         }
65         for(i=0;i<m;i++){
66             scanf("%d%d%d",&x,&y,&t);
67             for(j=0;j<5;j++)
68             {
69                 int a=x+dx[j],b=y+dy[j];
70                 if(isin(a,b))
71                 {
72                     p[a][b].f=1;
73                     p[a][b].t=min(p[a][b].t,t);
74                 }
75             }
76         }
77         while(!q.empty()) q.pop();
78         p[0][0].s=0;
79         q.push(p[0][0]);
80         vis[0][0]=1;
81         step=-1;
82         memset(vis,0,sizeof(vis));
83         bfs();
84         printf("%d\n",step);
85     }
86     return 0;
87 }

  

时间: 2024-10-08 14:22:21

poj3669 广搜的相关文章

NYOJ 284 坦克大战 &amp;&amp; POJ 2312 Battle City (广搜+优先队列)

链接:click here~~ 题意: 描述 Many of us had played the game "Battle city" in our childhood, and some people (like me) even often play it on computer now. What we are discussing is a simple edition of this game. Given a map that consists of empty space

Catch That Cow(广搜)

个人心得:其实有关搜素或者地图啥的都可以用广搜,但要注意标志物不然会变得很复杂,想这题,忘记了标志,结果内存超时: 将每个动作扔入队列,但要注意如何更简便,更节省时间,空间 Farmer John has been informed of the location of a fugitive cow and wants to catch her immediately. He starts at a point N (0 ≤ N ≤ 100,000) on a number line and t

codevs 1225:八数码难题【双向广搜】

这里是传送门 这道题用普通BFS是可以做的,但是很明显没得过,效率太低了.效率更高的算法A*和双向广搜都可取,这写一下双向广搜的. 注意题目中的判重很重要,可以转化成九位数用hash来解决这个问题. #include <set> #include <string> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define

迷宫广搜

上学期学了C,这学期学C++.感觉最难的还是算法,上周作业的一道广搜题是我第一次接触广搜,由于第一学期刚学编程就接触的太多的算法难题,不禁对代码产生畏惧,不过还好没有放弃,虽然算法很难,但我慢慢找到了一点学数学时的乐趣.先介绍一下这道未来的我看过来会觉得很简单一道题吧 You are provided a maze(迷宫), and you need to program to find the least steps to walk from the start to the end.And

宽搜和广搜、

广搜与深搜的小区别 一般来说,广搜常用于找单一的最短路线,或者是规模小的路径搜索,它的特点是"搜到就是最优解", 而深搜用于找多个解或者是"步数已知(好比3步就必需达到前提)"的标题,它的空间效率高,然则找到的不必定是最优解,必需记实并完成全数搜索,故一般情况下,深搜需要很是高效的剪枝(优化). 像搜索最短路径这些的很显著若是用广搜,因为广搜的特征就是一层一层往下搜的,保证当前搜到的都是最优解,当然,最短路径只是一方面的操作,像什么起码状态转换也是可以操作的.深搜就

hdu1241详解 Java广搜搞定

import java.util.Scanner; public class Main{ public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNext()) { int m = sc.nextInt();//输入地图的行数 int n = sc.nextInt();//输入地图的列数 if (m == 0) {//若m=0则退出程序 break; } // 初始化图

poj 1166 The Clocks 记录路径的广搜

题意: 给9个时钟的初始状态,和一些对某几个钟的操作,求最少经过几步能到目标状态(全指向12点). 分析: 明显的广搜,但实现起来的细节要注意:1.因为要记录路径,所以要在整个程序执行过程中扩展出的节点在输出路径前不能销毁, 故采用静态内存分配的方法(开node[600000],用get_node()创建节点.2.queue<node>比queue<int>要多花1别的时间. //poj 1166 //sep9 #include <iostream> #include

nyoj 523 双向广搜

题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=523 #include<iostream> #include<cstdio> #include<queue> using namespace std; /* 用普通搜索TLE,已知起点和终点,可以考虑双向广搜或A*算法加速搜索 双向广搜,一个方向从出发点向终点搜索,一个方向从终点向出发点搜索,搜索到相同的结点时,即找到最短路径. */ const int N

hdu 2717 Catch That Cow(广搜bfs)

题目链接:http://i.cnblogs.com/EditPosts.aspx?opt=1 Catch That Cow Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7909    Accepted Submission(s): 2498 Problem Description Farmer John has been inform