题解 广搜 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.代码不整洁
浙公网安备 33010602011771号