POJ 3728

POJ 3728

http://poj.org/problem?id=3278

题目大意就是在同一坐标轴上给你一个人的坐标,一个牛的坐标,而人的运动每一次运动有三种方式,一种是后退1,一种是前进1,还有一种是坐标翻倍,问最短的运动次数

这是我所接触的第一个BFS也就是广度优先搜索,在网上看了几篇博客,发现一篇的是最好理解的,然后我就照着做了,也A了

 1 #include <stdio.h>
 2 #include <iostream>
 3 #include <queue>
 4 #include <string.h>
 5 
 6 using namespace std;
 7 
 8 #define max 200040        
 9 
10 queue<int >q;          //定义一个队列,用来存每次所到达的位置
11 
12 int step[max];        //用来存到达某个位置时,所用的步数
13 int next,head,m,n;
14 bool road[max];        //但每次人走过之后,就记住这个地方已经被走过,因为之后在走这个地方的时候,步数肯定比第一次走的时候要多
15 
16 int dfs()
17 {
18     q.push(m);        //首先把m也就是人的起始位置进队,然后对其的步数和位置进行标记
19     step[m]=0;
20     road[m]=true;
21     while(!q.empty())    //当队列中没有元素时就结束循环
22     {
23         head=q.front();    //head在这里代表着你此时此刻的位置
24         q.pop();
25         for(int i=0;i<3;i++)    //因为要3种选择,所以用一个循环来进行,每走一次,如果之前没有走过,那么就进队列。如果走过,就跳过。
26         {                //而当每一次做出选择之后,都会有三个选择来进行下一步,而这三个选择,步数是相同的,之前没走过的,就进队
27             if(i==0) next=head-1;    
28         else if(i==1) next=head+1;
29         else next=2*head;
30         if(next>max||next<0) continue;
31         if(road[next]==false)
32         {
33             q.push(next);
34             road[next]=true;
35             step[next]=step[head]+1;
36         }
37         if(next==n) return step[next];    //人到达了牛的位置,返回当前位置的步数
38         }
39     }
40     return 0;
41 }
42 int main()
43 {
44     memset(road,false,sizeof(road));    //对road这个标记是否走过的数组进行初始化
45     scanf("%d%d",&m,&n);
46     if(m>=n) printf("%d",m-n);        //当人在牛的右边的时候,则人只可能有一种走法,也就是向左走,那么步数也就是二者相差的距离;
47     else printf("%d",dfs());
48     return 0;
49 }

在poj上,用C++交就runtime error,用G++交就AC了,有时候同一段代码,用G++和C++交所对应的时间和内存都是不同的,这或许与二者的机制有关