题解 广搜 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.代码不整洁