1014-A strange lift

同1013-A strange lift题

1.题号:1014-A strange lift

2.题意:电梯:输入:n个楼层,起始楼层,终止楼层。之后n个数据是每个楼层的可移动层数,既是可上可下的层数,固定的。

3.思路:用队列,从开始就2个选择,上或者下,,,限制条件是《0或者》n或者走过这层了。首先用个数组储存每个楼层的数字。从开始楼层开始广搜,压缩进队列去,下个状态,判断,可以则继续压缩,取出,再压缩,直到队列为空或者在中间就找到目标,则输出步数或-1。

4.感想:挺有意思的一个题,思路很简单。

5.AC代码:

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int arr[205],brr[205];
int start,finish,n;

struct dianti
{
  int lift,step;
};

int bfs(void)
{
  dianti t,k;
  queue <dianti> q;
  memset(brr,0,sizeof(brr));
  t.lift=start;
  t.step=0;
  brr[t.lift]=1;
  q.push(t);
  while(!q.empty())
  {
    t=q.front();
    q.pop();
    if(t.lift==finish)
       return t.step;
    k.lift=t.lift-arr[t.lift];
    if(k.lift>0 && k.lift<=n && !brr[k.lift])
    {
      k.step=t.step+1;
      brr[t.lift]=1;
      q.push(k);
    }
    k.lift=t.lift+arr[t.lift];
    if(k.lift>0 && k.lift<=n && !brr[k.lift])
    {
      brr[t.lift]=1;
      k.step=t.step+1;
      q.push(k);
    }
  }
  return -1;
}


int main()
{
  int i;
  while(cin>>n)
  {
    if(n==0)
       break;
   else
       {
    cin>>start>>finish;
    for(i=1;i<=n;++i)
       cin>>arr[i];
    cout<<bfs()<<endl;
       }
  }
  return 0;
}

你可能感兴趣的:(搜索)