FZU 1205 小鼠迷宫问题
2009-08-12 08:57
459 查看
小鼠迷宫问题
解题:
广度搜索+回溯求值,先搜索到终点的最短路,然后从终点搜索到起点有多少条最短路。搜索题一直不会,有一天能自己完全会做的话就好。
Time Limit:1s | Memory limit:32M |
Accepted Submit:285 | Total Submit:876 |
问题描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。 小鼠的迷宫 编程任务 对于给定的小鼠的迷宫,编程计算小鼠a通向小鼠b的所有最短道路。 数据输入 本题有多组输入数据,你必须处理到EOF为止。 每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。(1≤p,r≤n; 1≤q,s≤m) 结果输出 对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。每组输出之间没有空行。 如果小鼠a无法通向小鼠b则输出“No Solution!”。 输入文件示例 8 8 3 3 3 4 5 6 6 2 1 7 7 输出文件示例 11 96 Original: FJOI2004 |
广度搜索+回溯求值,先搜索到终点的最短路,然后从终点搜索到起点有多少条最短路。搜索题一直不会,有一天能自己完全会做的话就好。
#include <iostream> #include <queue> using namespace std; #define MaxSize 102 typedef struct Node{ int x; int y; }Point; int num; //这里定义成count的竟然不行,晕倒 int dirX[4]={-1,0,1,0}; int dirY[4]={0,-1,0,1}; int map[MaxSize][MaxSize]; Point aMouse; void findNum(int x,int y) //搞不懂传进点结构的话就不行 { int i; if (x==aMouse.x && y==aMouse.y) //从终点往回找到起点的路 { num++; return; } for (i=0;i<4;i++) { if (map[x+dirX[i]][y+dirY[i]]==map[x][y]-1) { findNum(x+dirX[i],y+dirY[i]); } } } void BFS(int x,int y) { int i; map[x][y]=1; //起点刚开始不是可走点,因为已经站在上面了,刷为1 queue<Point> pointQueue; Point aPoint; aPoint.x=x;aPoint.y=y; pointQueue.push(aPoint); while (!pointQueue.empty()) { for (i=0;i<4;i++) //循环四个方向 { aPoint=pointQueue.front(); //取当前队列首 aPoint.x+=dirX[i],aPoint.y+=dirY[i]; //四个方向之一行走 if (map[aPoint.x][aPoint.y]==0) //前进的方向若为可行走的,则进栈 { pointQueue.push(aPoint); map[aPoint.x][aPoint.y]=map[pointQueue.front().x][pointQueue.front().y]+1; //那么前进的方向应是当前步数+1 } } pointQueue.pop(); } } int main() { int n,m,k,i,j; Point bMouse; while (cin>>n>>m>>k) { memset(map,0,sizeof(map)); for (i=0;i<=n+1;i++) { map[i][0]=-1; map[i][m+1]=-1; } for (i=0;i<=m+1;i++) { map[0][i]=-1; map[n+1][i]=-1; //这里写错了点,改了N久才发现 } while (k--) { cin>>i>>j; map[i][j]=-1; } cin>>aMouse.x>>aMouse.y>>bMouse.x>>bMouse.y; BFS(aMouse.x,aMouse.y); num=0; if (map[bMouse.x][bMouse.y]==0) { cout<<"No Solution!"<<endl; } else { findNum(bMouse.x,bMouse.y); cout<<map[bMouse.x][bMouse.y]-1<<endl; //要减去起点刷的1 cout<<num<<endl; } } return 0; }
相关文章推荐
- FZU1205/SDUT1157_小鼠迷宫问题(DFS+BFS)
- FZU 1205 小鼠迷宫问题 <BFS+DFS>
- FZU 1205(小鼠迷宫问题)BFS+DFS的基本综合运用(同一题目中体现两种搜索方法的特点)
- FZU1205 之 小鼠迷宫问题
- FZU - 1205 小鼠迷宫问题 (bfs+dfs)
- FZU1205 小鼠迷宫问题(搜索)
- FOJ 1205 小鼠迷宫问题
- FOJ 1205 小鼠迷宫问题【BFS+dfs回溯查找路径】
- Foj 1205 小鼠迷宫问题
- fuzhuo---Problem 1205 小鼠迷宫问题
- FOJ1205 小鼠迷宫问题 (BFD+递推)
- bfs fzu 1205 小鼠迷宫
- FZU 1205 小鼠迷宫(搜索)
- FOJ 1205 小鼠迷宫问题
- SDUT 1157-小鼠迷宫问题(BFS&DFS)
- fuz 1205(小鼠迷宫问题)
- 小鼠迷宫问题
- 小鼠迷宫问题
- fjnu 1354 小鼠迷宫问题
- SDUT1157:小鼠迷宫问题(bfs+dfs)