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

 

小鼠迷宫问题

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

题目描述

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

来源

代码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

 

posted @ 2013-12-10 14:35  狂盗一枝梅  阅读(658)  评论(0编辑  收藏  举报