您的位置:首页 > 其它

逃离ACM迷宫(BFS)

2017-07-27 16:18 295 查看

逃离ACM迷宫(BFS)

题目链接

题目描述

如下图所示的是一个由程序设计题目组成的ACM迷宫。迷宫的左上角是入口,右下角是出口。迷宫中每一个格子都有一个程序设计题目,挑战者要AC该题目后才能通过,大于0的数字表示AC该题目所需的最短时间。数字如果是0表示是陷阱,进去了就出不来。现在的问题是:求挑战者从入口到出口所需的最短时间。

解题思路:

1、由于状态转换太多,利用DFS容易超时,因此运用BFS,采用记忆化,对每个格子动态更新到此格子花费的最小时间,过滤掉时间过长的路线,动态更新最短时间即可解决。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
//此题的数据大小只有100*100,用深搜求所有路径的时间复杂度最大为O(100^4)
//考虑剪枝取得的最优路径可以简化算法
int vis[100][100];//记录地图
int Sum;//记录当前的最优时间
int SumTime[100][100];//记录到达某个点的时候的最优时间,并且动态更新
int dx[4]={-1,1,0,0};
int dy[4]={0,0,-1,1};
int N;
struct Node
{
int x;
int y;
int time;//已经花费的时间
};
Node goal;
Node st;
queue<Node>Q;
int flag;
void bfs()
{ while(!Q.empty()) Q.pop();
st.time=vis[st.x][st.y];//rudui
Q.push(st);
while(!Q.empty())
{
Node n=Q.front();Q.pop();
if(n.x==goal.x&&n.y==goal.y&&(Sum>n.time||Sum==-1)) Sum=n.time;//更新节点
for(int i=0;i<4;i++)
{
int x=n.x+dx[i],y=n.y+dy[i];
if(x>=0&&x<N&&y>=0&&y<N&&vis[x][y]!=0)//判断点的合法性
{   //剪枝,到的新的节点是不是当前最优节点,是则如队,不是则舍弃
if(vis[x][y]+n.time<SumTime[x][y]||SumTime[x][y]==-1)
{
SumTime[x][y]=vis[x][y]+n.time;
Node nn;
nn.x=x,nn.y=y,nn.time=vis[x][y]+n.time;
if(nn.x==goal.x&&nn.y==goal.y&&(Sum>n.time||Sum==-1))
{
Sum=nn.time;//更新节点
continue;
}
Q.push(nn);
}
}
}
}
}
int main()
{ //  freopen("d://in.txt","r",stdin);
while(~scanf("%d",&N))
{   flag=0;
Sum=-1;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
{
scanf("%d",&vis[i][j]);
SumTime[i][j]=-1;
}
goal.x=goal.y=N-1;
st.x=st.y=0;
bfs();
printf("min=%d\n",Sum);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: