题目描述
小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。
![](http://acm.sdut.edu.cn/image/1157.gif)
请编程对于给定的小鼠的迷宫,计算小鼠a通向小鼠b的所有最短道路。
![](http://acm.sdut.edu.cn/image/1157.gif)
请编程对于给定的小鼠的迷宫,计算小鼠a通向小鼠b的所有最短道路。
输入
本题有多组输入数据,你必须处理到EOF为止。
每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。
接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。
最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。
每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。
接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。
最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。
输出
对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。
每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。
每组输出之间没有空行。
如果小鼠a无法通向小鼠b则输出“No Solution!”。
每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。
每组输出之间没有空行。
如果小鼠a无法通向小鼠b则输出“No Solution!”。
示例输入
8 8 3 3 3 4 5 6 6 2 1 7 7
示例输出
11 96
BFS广度遍历图表解释 ①起始位置(3.4).终止位置(6,6)
http://sjjg.js.zwu.edu.cn/SFXX/sf1/gdyxbl.html(BFS演示)
DFS深度遍历(此处只往右遍历)
此题用BFS遍历得出最短路径是多长,然后由DFS遍历出所有最短路径总数
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<queue> 5 #define N 100 6 using namespace std; 7 int mark[N][N]; 8 int map[N][N]; 9 struct node 10 { 11 int x,y,step; 12 }; 13 int n,m,k; 14 int min_step; 15 int num; 16 int x1,x2,y1,y2; 17 int dir[4][2]={0,1,0,-1,1,0,-1,0}; 18 int BFS() 19 { 20 int x,y,i; 21 queue<node>q; 22 node cur,next; 23 cur.x=x1;cur.y=y1;cur.step=0; 24 q.push(cur); 25 mark[x1][y1]=1; 26 while(!q.empty()) 27 { 28 cur=q.front(); 29 q.pop(); 30 if(cur.x==x2&&cur.y==y2) 31 return cur.step; 32 for(i=0;i<4;i++) 33 { 34 next.x=x=cur.x+dir[i][0]; 35 next.y=y=cur.y+dir[i][1]; 36 if(x>=1&&x<=n&&y>=1&&y<=m&&mark[x][y]==0) 37 { 38 next.step=cur.step+1; 39 q.push(next); 40 mark[x][y]=1; 41 } 42 } 43 }return -1; 44 } 45 void DFS(int x,int y,int c_step) 46 { 47 if(x==x2&&y==y2&&c_step==min_step) 48 { 49 num++; 50 return ; 51 } 52 if((x>x2?x-x2:x2-x)+(y>y2?y-y2:y2-y)+c_step>min_step)return; 53 int i; 54 for(i=0;i<4;i++) 55 { 56 int xx,yy; 57 xx=x+dir[i][0]; 58 yy=y+dir[i][1]; 59 if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&map[xx][yy]==0) 60 { 61 map[xx][yy]=1; 62 DFS(xx,yy,c_step+1); 63 map[xx][yy]=0; 64 } 65 } 66 } 67 int main() 68 { 69 while(~scanf("%d%d%d",&n,&m,&k)) 70 { 71 int i; 72 memset(mark,0,sizeof(mark)); 73 memset(map,0,sizeof(map)); 74 for(i=1;i<=k;i++) 75 { 76 int a,b;cin>>a>>b; 77 map[a][b]=1; 78 mark[a][b]=1; 79 } 80 cin>>x1>>y1; 81 cin>>x2>>y2; 82 min_step=-1; 83 min_step=BFS(); 84 if(min_step==-1) 85 cout<<"No Solution!"<<endl; 86 else 87 { 88 num=0; 89 DFS(x1,y1,0); 90 cout<<min_step<<endl; 91 cout<<num<<endl; 92 } 93 }return 0; 94 }