题解 广搜 POJ 3278

题意:在X轴上,有两个点(0<N,K<100000),N点和K点,K有两种移动方式 坐标+1,-1坐标*2。

  求K到N移动最小步数。

做法:建立一个队列。K每移动一次,将所有可能情况加入队列,并且删除这些情况的的父亲节点。

  建立一个数组。每移动一次,该坐标的对应数组+1;直至到达N点(N点对应数组不为0) 输出N点数值;

代码:

#include <iostream>
#include <queue>
using namespace std;
queue <int> que;
int num=0;int n,k;int m,i;
int sum[100000];
void dps (int k)
{
    m=que.size();
    for(i=0;i<m;i++)
    {

        if(que.front()!=k)
        {
                if(que.front()<=50000&&que.front()>0&&sum[que.front()*2]==0)
                    que.push(que.front()*2),sum[que.front()*2]=sum[que.front()]+1;
                if(que.front()<=100000&&que.front()>=0&&sum[que.front()+1]==0)
                    que.push(que.front()+1),sum[que.front()+1]=sum[que.front()]+1;
                if(que.front()<=100000&&que.front()>0&&sum[que.front()-1]==0)
                    que.push(que.front()-1),sum[que.front()-1]=sum[que.front()]+1;
                que.pop();
        }
        else if(que.front()==k)
            break;
    }
    return;
}
int main()
{
    for(i=0;i<100000;i++)
        sum[i]=0;
  cin>>n>>k;
  if(n>=k)
    cout<<n-k<<endl;
  else
  {
      que.push(n);
      sum[n]=0;
      while(que.front()!=k)dps(k);
      cout<<sum[k]<<endl;
  }
  return 0;
}
错误原因:1.复制代码更改数据经常出错
<span style="white-space:pre">	</span>  2.代码不整洁

posted on 2014-07-14 16:45  一锅土豆  阅读(137)  评论(0编辑  收藏  举报