小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】

 

小鼠迷宫问题

Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。 

小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】

 请编程对于给定的小鼠的迷宫,计算小鼠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

来源

代码1:超时

这个代码只用dfs,这可以求出所有到达终点的路径,当然也包括最短路径,用存储起来的话,第一个不是0的数组元素就是所求,其中,下标是最短路径,值是方法数,但是由于求出了所有路径和其对应的方法数,而除了最短路径之外剩下的方法都是没有必要求出来的,所以超时了,必须先用bfs求出最短路,优化dfs代码。

 1 #include<iostream>

 2 #include<string.h>

 3 #include<string>

 4 #include<stdlib.h>

 5 using namespace std;

 6 int m,n,k,visited[101][101],mapx[101][101];

 7 int sx,sy,ex,ey,sum,hx[100000];

 8 void dfs(int ,int );

 9 int main()

10 {

11     while(cin>>m>>n>>k)

12     {

13         memset(mapx,0,sizeof(mapx));

14         memset(visited,0,sizeof(visited));

15         memset(hx,0,sizeof(hx));

16         sum=0;

17         int i,u,v,j;

18         for(i=1; i<=k; i++)

19         {

20             cin>>u>>v;

21             mapx[v][u]=1;

22         }

23         cin>>sy>>sx>>ey>>ex;

24         dfs(sx,sy);

25         for(i=0; i<=100000; i++)

26             if(hx[i]!=0)

27             {

28                 cout<<i<<endl;

29                 cout<<hx[i]<<endl;

30                 break;

31             }

32         if(i==100001)

33             cout<<"No Solution!"<<endl;

34     }

35     return 0;

36 }

37 int h[]= {0,-1,0,1},z[]= {-1,0,1,0};

38 void dfs(int x,int y)

39 {

40     visited[x][y]=1;

41     if(x==ex&&ey==y)

42     {

43         hx[sum]++;

44     }

45     sum++;

46     int heng,zong;

47     int i;

48     for(i=0; i<=3; i++)

49     {

50         heng=x+h[i];

51         zong=y+z[i];

52         if(heng<=0||zong<=0||heng>m||zong>n)

53             continue;

54         else

55         {

56             if(visited[heng][zong]==0&&mapx[heng][zong]!=1)

57             {

58                 dfs(heng,zong);

59             }

60         }

61     }

62     visited[x][y]=0;

63     sum--;

64 }
View Code

代码2:ac

  1 #include<iostream>

  2 #include<string.h>

  3 #include<string>

  4 #include<stdlib.h>

  5 #include<queue>

  6 #include<math.h>

  7 using namespace std;

  8 struct vode

  9 {

 10     int x,y,step;

 11 };

 12 int m,n,k,visited[101][101],mapx[101][101];

 13 int sx,sy,ex,ey,hx[100001],zong,jishu,sum;

 14 void dfs(int ,int ,int);

 15 int bfs();

 16 int main()

 17 {

 18     while(cin>>m>>n>>k)

 19     {

 20         memset(mapx,0,sizeof(mapx));

 21         memset(visited,0,sizeof(visited));

 22         memset(hx,0,sizeof(hx));

 23         zong=0;

 24         jishu=0;

 25         sum=0;

 26         int i,u,v;

 27         for(i=1; i<=k; i++)

 28         {

 29             cin>>u>>v;

 30             mapx[v][u]=1;

 31         }

 32         cin>>sy>>sx>>ey>>ex;

 33         zong=bfs();

 34         if(zong==-1)

 35         {

 36             cout<<"No sulution!"<<endl;

 37             continue;

 38         }

 39         else

 40         {

 41             memset(visited,0,sizeof(visited));

 42             dfs(sx,sy,sum);

 43             cout<<zong<<endl;

 44             cout<<jishu<<endl;

 45         }

 46     }

 47     return 0;

 48 }

 49 int h[]= {0,-1,0,1},z[]= {-1,0,1,0};

 50 int bfs()

 51 {

 52     int i,heng,zong;

 53     queue<struct vode>que;

 54     struct vode q;

 55     q.x=sx;

 56     q.y=sy;

 57     q.step=1;

 58     que.push(q);

 59     int flag=0;

 60     while(!que.empty())

 61     {

 62         q=que.front();

 63         for(i=0; i<=3; i++)

 64         {

 65             heng=q.x+h[i];

 66             zong=q.y+z[i];

 67             if(heng<=0||zong<=0||heng>ex||zong>ey)

 68                 continue;

 69             else if(visited[heng][zong]==0&&mapx[heng][zong]==0)

 70             {

 71                 visited[heng][zong]=1;

 72                 if(heng==ex&&zong==ey)

 73                 {

 74                     flag=1;

 75                     break;

 76                 }

 77                 else

 78                 {

 79                     struct vode p;

 80                     p.x=heng;

 81                     p.y=zong;

 82                     p.step=q.step+1;

 83                     que.push(p);

 84                 }

 85             }

 86         }

 87         if(flag==1)

 88             break;

 89         que.pop();

 90     }

 91     if(que.empty()&&flag==0)return -1;

 92     else return que.front().step;

 93 }

 94 void dfs(int x,int y,int sum)

 95 {

 96     if(x==ex&&y==ey&&sum==zong)

 97     {

 98         jishu++;

 99         return ;

100     }

101     if(fabs(x-ex)+fabs(y-ey)+sum>zong)return ;

102     int i,heng,zong;

103     for(i=0; i<=3; i++)

104     {

105         heng=x+h[i];

106         zong=y+z[i];

107         if(heng>m||zong>n||heng<=0||zong<=0)

108             continue;

109         else

110         {

111             if(visited[heng][zong]==0&&mapx[heng][zong]==0)

112             {

113                 visited[heng][zong]=1;

114                 dfs(heng,zong,sum+1);

115                 visited[heng][zong]=0;

116             }

117         }

118     }

119 }
View Code

 

你可能感兴趣的:(DFS)