您的位置:首页 > 其它

HDOJ1548(DFS超内存,BFS过了)

2015-08-29 10:31 309 查看
DFS代码

#include<iostream>
#include<cstdio>
using namespace std;
#define Min(a,b) (a<b)?a:b
const int MAX_N=205;
const int INF=0x30303030;
int floors[MAX_N];
int N, A, B;
int step[MAX_N];
int dfs(int k)
{
if(k<1||k>N)    return INF;
if(step[k]!=-1)
{
return step[k];
}
if(k==B)
{
return 0;
}
return step[k]=Min(dfs(k-floors[k])+1,dfs(k+floors[k])+1);
}

int main()
{
while(scanf("%d",&N)!=EOF&&N!=0)
{
scanf("%d %d",&A, &B);
for(int i=1; i<=N; i++)
{
scanf("%d",&floors[i]);
}
memset(step,-1,sizeof(step));
int ans=dfs(A);
if(ans>=INF)
{
printf("-1\n");
}
else
{
printf("%d\n",ans);
}
}

return 0;
}


BFS:AC代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int MAX_N=205;
const int INF=0x30303030;
int floors[MAX_N];
int N, A, B;
typedef pair<int, int> P;
int vis[MAX_N];

int bfs()
{
memset(vis, 0, sizeof(vis));
queue<P> que;
que.push(P(0,A));
vis[A]=1;
while(!que.empty())
{
P pos=que.front();que.pop();
int k=pos.second;
int step=pos.first;
if(k==B)
{
return step;
}
for(int i=-1; i<=1; i++)
{
int next=(k + i*floors[k]);
if(next>=1&&next<=N&&!vis[next])
{
vis[next]=1;
que.push(P(step+1,next));
}
}

}

return INF;
}

int main()
{
while(scanf("%d",&N)!=EOF&&N!=0)
{
scanf("%d %d",&A, &B);
for(int i=1; i<=N; i++)
{
scanf("%d",&floors[i]);
}
int ans=bfs();
if(ans==INF)
{
printf("-1\n");
}
else
{
printf("%d\n",ans);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: