原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548
分析:广度优先搜索。对满足条件的楼层入队列,第一次得到的目的楼层一定是最少次数到达的。
我的代码:
#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
struct Node
{
int floor; //楼层数
int k; //在本楼可走的步数。
int num;
};
int n,s,e; //楼数,起始点,结束点。
Node p[205];
bool visited[205];
queue<Node> Q;
bool flag;
int ans;
void BFS()
{
while(!Q.empty()) Q.pop();
p[s].num=0;
Q.push(p[s]);
visited[s]=1;
while(!Q.empty())
{
Node T=Q.front();
Q.pop();
if(T.floor==e)
{
flag=1;
ans=T.num;
}
int nfloor;
nfloor=T.floor+T.k; //向上走
if(nfloor<=n&&!visited[nfloor]) //要先判断nfloor是否溢出,不然的话数组会越界。
{
visited[nfloor]=1;
p[nfloor].num=T.num+1;
Q.push(p[nfloor]);
}
nfloor=T.floor-T.k; //向下走
if(nfloor>=1&&!visited[nfloor])
{
visited[nfloor]=1;
p[nfloor].num=T.num+1;
Q.push(p[nfloor]);
}
}
}
int main()
{
while(~scanf("%d",&n)&&n)
{
scanf("%d%d",&s,&e);
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&p[i].k);
p[i].floor=i;
p[i].num=0;
visited[i]=0;
}
flag=false;
BFS();
if(flag) printf("%d\n",ans);
else printf("-1\n");
}
return 0;
}
总结:开始时没有开visited数组,没有标志导致 Memory Limit Exceeded -_-|||