题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目大意:
一共的楼层为n,每个楼层有对应的值,
这个奇怪的电梯在对应楼层只能向上或向下移动该层对应值的层数。
如测试样例:
5 1 5
3 3 1 2 5
对应输出
3
第一层只能向上或向下3层,而向下是非法的 所以只能向上。
最终要求我们输出最少电梯要移动几次从起点到达终点
如果到不了 就输出-1.
-----------------------------------------------------------------------------------------------------------------------------------------------------------
基本思路:采取广搜,一旦搜到就返回路径长度,如果搜完起点所在的连通分支(这个名词我还不是特别清楚,如果用错了请指出),还没有找到终点,就输出-1.
BFS:AC代码
#include <stdio.h>
#include <string.h>
#include <stdbool.h>
int a[1000];
int d[1000];
int color[1000];
struct queue
{
int mem[1000];
int end;
} q;
void initial_q(){
q.end = 0;
memset(q.mem,0,sizeof(q.mem));
}
bool empty_q(){
return q.end == 0;
}
void Push(int a){
int index = q.end;
q.end++;
q.mem[index]=a;
}
int Pop(){
int temp = q.mem[0];
q.end--;
int i;
for(i=0;i<q.end;i++)
q.mem[i]=q.mem[i+1];
return temp;
}
int bfs(int A,int B,int N){
memset(color,0,sizeof(color));
memset(d,0,sizeof(d));
initial_q();
color[A] = 1;
d[A] = 0;
Push(A);
int u;
while(!empty_q()){
u = Pop();
if(u==B){
printf("%d\n",d[u]);
return d[u];
}
if(u+a[u]<=N && u+a[u]>=1 &&color[u+a[u]]==0){
d[u+a[u]] = d[u] + 1;
color[u+a[u]] = 1;
Push(u+a[u]);
}
if(u-a[u]>=1 && u-a[u]<=N && color[u-a[u]]==0){
d[u-a[u]] = d[u] + 1;
color[u-a[u]] = 1;
Push(u-a[u]);
}
}
printf("-1\n");
return -1;
}
int main(int argc, int const *argv[])
{
int N,A,B;
int i;
int ans;
while(scanf("%d",&N)!=EOF&&N){
scanf("%d %d",&A,&B);
for(i=1;i<=N;i++)
scanf("%d",a+i);
ans=bfs(A,B,N);
}
return 0;
}
这边原来试着去写 dfs 然后用一个数组来记忆每个节点到终点的最短跳跃数,但由于这边貌似并不是一棵树,存在环,所以貌似不能得出正确结果.
如果只是用dfs穷举的话,超时了.
试着去写迭代深搜.写过了的话 再贴出来分享.