Accept: 341Submit: 1098
Time Limit: 1000 mSecMemory Limit : 32768 KB
Problem Description
问题描述
小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。
小鼠的迷宫
编程任务
对于给定的小鼠的迷宫,编程计算小鼠a通向小鼠b的所有最短道路。
Input
本题有多组输入数据,你必须处理到EOF为止。
每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。(1≤p,r≤n; 1≤q,s≤m)
每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。(1≤p,r≤n; 1≤q,s≤m)
结果输出
Output
对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。每组输出之间没有空行。
如果小鼠a无法通向小鼠b则输出“No Solution!”。
如果小鼠a无法通向小鼠b则输出“No Solution!”。
Sample Input
8 8 3
3 3
4 5
6 6
2 1
7 7
Sample Output
11
96
首先bsf得到最短路劲
然后从老鼠b开始回朔, 得到所有可能的路径
#include<iostream>
#include<queue>
using namespace std;
#define MAX 102
struct Point
{
int x,y;
}a,b;
int map[MAX][MAX],total;
int dirx[]={-1,0,1,0};
int diry[]={0,-1,0,1};
void bsf(int x,int y)
{
int i;
queue<Point> q;
map[x][y]=1;
Point tmp,tmp2;
tmp.x=x; tmp.y=y;
q.push(tmp);
while(!q.empty())
{
for(i=0;i<4;i++)
{
tmp=q.front();
tmp2.x=tmp.x+dirx[i];
tmp2.y=tmp.y+diry[i];
if(map[tmp2.x][tmp2.y]==0)
{
q.push(tmp2);
map[tmp2.x][tmp2.y]=map[tmp.x][tmp.y]+1;
}
}
q.pop();
}
}
void search(int x,int y)
{
int i;
if(x==a.x&&y==a.y)
{
total++;
return;
}
else
{
for(i=0;i<4;i++)
if(map[x+dirx[i]][y+diry[i]]==map[x][y]-1)
search(x+dirx[i], y+diry[i]);
}
}
int main()
{
int n,m,k,i,x,y;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
total=0;
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;
}
while(k--)
{
scanf("%d%d",&x,&y);
map[x][y]=-1;
}
scanf("%d%d%d%d",&a.x,&a.y,&b.x,&b.y);
bsf(a.x,a.y);
if(map[b.x][b.y]==0)
printf("No Solution!/n");
else
{
search(b.x,b.y);
printf("%d/n%d/n",map[b.x][b.y]-1,total);
}
}
return 0;
}