小鼠迷宫问题
Time Limit: 1500ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。
请编程对于给定的小鼠的迷宫,计算小鼠a通向小鼠b的所有最短道路。
请编程对于给定的小鼠的迷宫,计算小鼠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
来源
代码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 }
代码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 }