您的位置:首页 > 其它

HDU 1548 A strange lift

2013-08-24 17:09 288 查看
代码bfs:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int n,A,B;
int lift[205];
bool vis[205];
int step[1005],loc[1005];
queue<int> q;
bool dis(int x)
{
if(x>=1&&x<=n)
return true;
return false;
}
int BFS()
{
int front,tail;
front=tail=0;
loc[front++]=A;
int up,down;
while(front>tail)
{
int x=loc[tail++];
// cout<<x<<endl;
if(x==B) break;
up=x+lift[x];
down=x-lift[x];
if(!vis[up]&&dis(up))
{
vis[up]=true;
loc[front++]=up;
step[up]=step[x]+1;
}
if(!vis[down]&&dis(down))
{
vis[down]=true;
loc[front++]=down;
step[down]=step[x]+1;
}
}
return step[B];
}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d%d",&A,&B);
memset(lift,0,sizeof(lift));
int i,j;
for(i=1;i<=n;i++)
{
scanf("%d",&lift[i]);
vis[i]=false;
step[i]=0;
}

if(A==B) printf("0\n");
else
{
int ans=BFS();
if(ans==0) printf("-1\n");
else
{

printf("%d\n",ans);
}
}
}
return 0;
}



代码 Dijskra:
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0x7ffff
using namespace std;
int n,A,B;
int dp[205][205];
int lift[205],dis[10005];
bool vis[10005];
void Dij()
{
int i;
for(i=0;i<=n;i++)
{
dis[i]=dp[A][i];
// cout<<dis[i]<<endl;
vis[i]=true;
}
vis[A]=false;
dis[A]=0;
int min,k;
for(i=1;i<=n;i++)
{
min=INF;
for(int j=1;j<=n;j++)
{
if(vis[j]&&min>dis[j])
{
min=dis[j];
k=j;
}
}

if(min==INF) break;
vis[k]=false;
for(int j=1;j<=n;j++)
{
if(vis[j]&&dis[k]+dp[k][j]<dis[j])
{
dis[j]=dis[k]+dp[k][j];
}
}
}

}
int main()
{
while(scanf("%d",&n)!=EOF&&n)
{
scanf("%d%d",&A,&B);
int i,j;
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
dp[i][j]=INF;
for(i=1;i<=n;i++)
{
scanf("%d",&lift[i]);
if(i-lift[i]>0) dp[i][i-lift[i]]=1;
if(i+lift[i]<=n) dp[i][i+lift[i]]=1;
}
Dij();
if(dis[B]==INF) printf("-1\n");
else
printf("%d\n",dis[B]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: