标签:des style blog http color os strong 数据
解题报告
http://blog.csdn.net/juncoder/article/details/38146041
题意
求最短路和最短路的路数。
思路:
BFS+DFS,先求出最短路。在DFS搜等于最短路的条数。
不加优化SDUTOJ过了,数据就是水。
确定了最短路的长度,加上奇偶剪枝FOJ也过了。
#include <queue> #include <cmath> #include <cstdio> #include <cstring> #include <iostream> using namespace std; int mmap[1000][1000],vis[1000][1000],n,m,k,cnt,q,p,r,minstep,s; struct node { int x,y,step; }; int dx[]= {-1,0,1,0}; int dy[]= {0,1,0,-1}; int bfs() { queue<node>Q; node next,now; now.x=p; now.y=q; now.step=0; vis[p][q]=1; Q.push(now); while(!Q.empty()) { now=Q.front(); Q.pop(); if(now.x==r&&now.y==s) { return now.step; } for(int i=0; i<4; i++) { next.x=now.x+dx[i]; next.y=now.y+dy[i]; if(next.x>=1&&next.x<=n&&next.y>=1&&next.y<=m&&!mmap[next.x][next.y]&&!vis[next.x][next.y]) { next.step=now.step+1; Q.push(next); vis[next.x][next.y]=1; } } } } void dfs(int b,int e,int step) { if(b==r&&e==s&&minstep==step) { cnt++; return ; } //if(step>minstep)return ;没优化 if(abs(b-r)+abs(e-s)+step>minstep)return ; for(int i=0; i<4; i++) { int x=b+dx[i]; int y=e+dy[i]; if(x>=1&&x<=n&&y>=1&&y<=m&&!mmap[x][y]&&!vis[x][y]) { // printf("%d %d\n",x,y); vis[x][y]=1; dfs(x,y,step+1); vis[x][y]=0; } } } int main() { int i,j,x,y; while(~scanf("%d%d%d",&n,&m,&k)) { cnt=0; memset(mmap,0,sizeof(mmap)); memset(vis,0,sizeof(vis)); for(i=0; i<k; i++) { scanf("%d%d",&x,&y); mmap[x][y]=1; } scanf("%d%d",&p,&q); scanf("%d%d",&r,&s); minstep=bfs(); printf("%d\n",minstep); memset(vis,0,sizeof(vis)); dfs(p,q,0); vis[p][q]=1; printf("%d\n",cnt); } }
问题描述
小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。
编程任务
对于给定的小鼠的迷宫,编程计算小鼠a通向小鼠b的所有最短道路。结果输出
FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS),布布扣,bubuko.com
FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)
标签:des style blog http color os strong 数据
原文地址:http://blog.csdn.net/juncoder/article/details/38146041