sdut 1157 小鼠迷宫

题目描述

小鼠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)。

输出

对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。
每组数据输出两行,第一行是最短路长度;第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 }

 

posted @ 2013-08-20 15:35  WangLC  阅读(362)  评论(0)    收藏  举报