zoukankan      html  css  js  c++  java
  • ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)

     小鼠迷宫问题

    Time Limit: 2 Sec  Memory Limit: 64 MB
    Submit: 1  Solved: 1
    [Submit][Status][Web Board]

    Description

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

     

    请编程对于给定的小鼠的迷宫,计算小鼠a通向小鼠b的所有最短道路。

    Input

    本题有多组输入数据,你必须处理到EOF为止。 每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。

    Output

    对于每组数据,将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出。每组数据输出两行,第一行是最短路长度;第2行是不同的最短路数。每组输出之间没有空行。 如果小鼠a无法通向小鼠b则输出“No Solution!”。

    Sample Input

    8 8 3

    3 3

    4 5

    6 6

    2 1

    7 7

     

    Sample Output

    11

    96

       这是道搜索题,要求输出矩阵内a到b点的最短路长度,以及最短路的条数,并且要绕过限定的“封闭房间”,即某些格子无法走。

      还可参照 ytu 2463:给小鼠补充代码 同样的题,不同的考察形式。

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 int f[100][100];
     5 int ax,ay;
     6 int bx,by;
     7 int dx[4]={0,1,0,-1};
     8 int dy[4]={1,0,-1,0};
     9 int _count=0;
    10 int _min=9999999;
    11 int n,m,k;
    12 
    13 void dfs(int d,int t,int curx,int cury)
    14 {
    15     if(t>_min)
    16         return ;
    17     if(curx<0 || cury<0 || curx>n-1 || cury>m-1)
    18         return ;
    19     if(cury==by && curx==bx){
    20         if(t<_min){
    21             _count=1;
    22             _min=t;
    23         }
    24         else{
    25             _count++;
    26         }
    27         return ;
    28     }
    29         for(int i=0;i<4;i++){
    30             if(curx+dx[i]<0 || cury+dy[i]<0) continue;
    31             if(!f[curx+dx[i]][cury+dy[i]]){
    32                 f[curx+dx[i]][cury+dy[i]]=true;
    33                 dfs(i,t+1,curx+dx[i],cury+dy[i]);
    34                 f[curx+dx[i]][cury+dy[i]]=false;
    35             }
    36         }
    37 
    38     return ;
    39 }
    40 
    41 int main()
    42 {
    43     while(cin>>n>>m>>k){
    44         _count=0;
    45         _min=99999999;
    46         memset(f,0,sizeof(f));
    47         for(int i=1;i<=k;i++){
    48             int a,b;
    49             cin>>a>>b;
    50             f[a][b]=true;
    51         }
    52         cin>>ax>>ay;
    53         cin>>bx>>by;
    54         dfs(-1,0,ax,ay);
    55         cout<<_min<<endl;
    56         cout<<_count<<endl;
    57     }
    58     return 0;
    59 }

    Freecode : www.cnblogs.com/yym2013

  • 相关阅读:
    (转)查找算法:哈希查找
    VIM纵向编辑【转】
    linux下的终端利器 tmux 安装以及使用
    Windows一键设置环境变量(以设置java环境变量为例)
    如何在指针中隐藏数据?
    cygwin gcc 编译windowsAPI 报错的一个解决方案
    Centos 7 最小化部署svn版本控制(http协议)
    Centos 7 最小化vnc远程桌面部署
    Centos 7 最小化图形界面安装
    Python的迭代器与生成器
  • 原文地址:https://www.cnblogs.com/yym2013/p/3485006.html
Copyright © 2011-2022 走看看