zoukankan      html  css  js  c++  java
  • 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都过不了的,我认为逻辑没问题的。

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

  • 相关阅读:
    JAVA实现微信支付功能
    avue设置表格显示图片
    职工管理系统----删除职工
    职工管理系统---显示职工
    职工管理系统---读文件
    职工管理系统---写文件
    职工管理系统-------添加职工
    职工管理系统-----实现职工类
    职工管理系统-------实现退出功能
    职工管理系统-------菜单功能
  • 原文地址:https://www.cnblogs.com/YipWingTim/p/2229729.html
Copyright © 2011-2022 走看看