您的位置:首页 > 其它

FZU 1205 小鼠迷宫问题

2009-08-12 08:57 459 查看
小鼠迷宫问题

Time Limit:1sMemory limit:32M
Accepted Submit:285Total 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: