zoukankan      html  css  js  c++  java
  • 小鼠迷宫问题【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
  • 相关阅读:
    BZOJ 2655: calc(拉格朗日插值)
    BZOJ 1485: [HNOI2009]有趣的数列(卡特兰数)
    [学习笔记] 关于组合数的一些总结
    CF 1076E Vasya and a Tree(线段树+树剖)
    CF 1082E Increasing Frequency(贪心)
    51nod 1149 Pi的递推式(组合数学)
    LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想
    关于 unsigned int 比较大小
    洛谷 3295 [SCOI2016]萌萌哒——并查集优化连边
    洛谷 P4512 [模板] 多项式除法
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/3467377.html
Copyright © 2011-2022 走看看