逃离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); } }
相关文章推荐
- hdu 1728 逃离迷宫(BFS)
- HDU-1728 逃离迷宫(BFS)
- HDU1728:逃离迷宫(BFS)
- hdu1728逃离迷宫 (利用最短路径思想+优先队列(BFS))
- HDU 1728逃离迷宫(DFS或者BFS)
- HDOJ 1728 逃离迷宫(BFS)
- HDU1728:逃离迷宫【BFS】
- 杭电1728逃离迷宫 BFS 搜索
- hdu1728 逃离迷宫 --bfs
- hdu1728 逃离迷宫--BFS
- bfs hdu 1728 逃离迷宫
- HDU 1728逃离迷宫(DFS或者BFS)
- HDU 1728 逃离迷宫 BFS(加转弯数)
- HDOJ 题目1728 逃离迷宫(BFS)
- 杭电1728逃离迷宫解法二 BFS 搜索
- hdu1728 逃离迷宫(bfs限制拐弯次数)
- hdu 1728 逃离迷宫(BFS+稍微改变一下搜索步骤)
- HDU 1728 逃离迷宫(BFS)
- ACM:图BFS,迷宫
- hdu 1728 逃离迷宫 (bfs)