POJ 3278 Catch That Cow

View Code
 1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4
5 struct XPoint
6 {
7 int x;
8 int step;
9 }s,e;
10
11 XPoint route[110000];
12 bool visited[110000];
13 int rear,top;
14
15 XPoint bfs(XPoint point);
16
17 void init()
18 {
19 int m,n;
20 while(cin>>m>>n)
21 {
22 rear=top=0;
23 memset(route,0,sizeof(route));
24 memset(visited,false,sizeof(visited));
25 s.x=m;
26 s.step=0;
27 e.x=n;
28 visited[m]=true;
29 if(s.x>e.x)
30 cout<<s.x-e.x<<endl;
31 else
32 {
33 XPoint final=bfs(s);
34 cout<<final.step<<endl;
35 }
36 }
37 }
38
39 XPoint bfs(XPoint point)
40 {
41 if(point.x==e.x)
42 {
43 return point;
44 }
45 XPoint p1,p2,p3;
46 p1.x=2*point.x;
47 p2.x=point.x+1;
48 p3.x=point.x-1;
49 p1.step=p2.step=p3.step=point.step+1;
50 if(p1.x<110000&&visited[p1.x]==false)
51 {
52 visited[p1.x]=true;
53 route[++top]=p1;
54 if(visited[e.x])
55 return p1;
56 }
57 if(p2.x<110000&&visited[p2.x]==false)
58 {
59 visited[p2.x]=true;
60 route[++top]=p2;
61 if(visited[e.x])
62 return p2;
63 }
64 if(p3.x>=0&&visited[p3.x]==false)
65 {
66 visited[p3.x]=true;
67 route[++top]=p3;
68 if(visited[e.x])
69 return p3;
70 }
71 return bfs(route[++rear]);
72 }
73
74 int main()
75 {
76 init();
77 return 0;
78 }


折磨了我两天,我想不通为什么用递归写就过不了?难道是栈溢出?

后来看了一个大神的是用循环写的,我也用循环。A了。

View Code
 1 #include<iostream>
2 #include<cstring>
3 using namespace std;
4
5 struct XPoint
6 {
7 int x;
8 int step;
9 XPoint()
10 {
11
12 }
13 XPoint(int xx,int ss):x(xx),step(ss)
14 {
15
16 }
17 }s,e;
18
19 XPoint route[110000];
20 bool visited[110000];
21 int rear,top;
22
23 int bfs();
24
25 void init()
26 {
27 int m,n;
28 while(cin>>m>>n)
29 {
30 rear=top=0;
31 memset(route,0,sizeof(route));
32 memset(visited,false,sizeof(visited));
33 s.x=m;
34 s.step=0;
35 e.x=n;
36 route[0]=XPoint(m,0);
37 visited[m]=true;
38 if(s.x>=e.x)
39 cout<<s.x-e.x<<endl;
40 else
41 {
42 int final=bfs();
43 cout<<final<<endl;
44 }
45 }
46 }
47
48 int bfs()
49 {
50 while(1)
51 {
52 XPoint temp=route[rear++];
53 if(2*temp.x<110000&&visited[2*temp.x]==false)
54 {
55 visited[2*temp.x]=true;
56 route[++top]=XPoint(2*temp.x,temp.step+1);
57 }
58 if(temp.x+1<110000&&visited[temp.x+1]==false)
59 {
60 visited[temp.x+1]=true;
61 route[++top]=XPoint(temp.x+1,temp.step+1);
62 }
63 if(temp.x-1>=0&&visited[temp.x-1]==false)
64 {
65 visited[temp.x-1]=true;
66 route[++top]=XPoint(temp.x-1,temp.step+1);
67 }
68 if(visited[e.x])
69 {
70 return temp.step+1;
71 }
72 }
73 }
74
75 int main()
76 {
77 init();
78 return 0;
79 }

之前用测试数据:77 100都过不了的,我认为逻辑没问题的。

 

学到了一点,以后写深搜写广搜用循环好过递归。。。
 

posted @ 2011-10-31 02:04  YipWingTim  阅读(216)  评论(0编辑  收藏  举报