zoukankan      html  css  js  c++  java
  • sdut 1157 小鼠迷宫

    题目描述

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

    BFS广度遍历图表解释 ①起始位置(3.4).终止位置(6,6)

       http://sjjg.js.zwu.edu.cn/SFXX/sf1/gdyxbl.html(BFS演示)
     
    DFS深度遍历(此处只往右遍历)
    此题用BFS遍历得出最短路径是多长,然后由DFS遍历出所有最短路径总数
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<queue>
     5 #define N 100
     6 using namespace std;
     7 int mark[N][N];
     8 int map[N][N];
     9 struct node
    10 {
    11     int x,y,step;
    12 };
    13 int n,m,k;
    14 int min_step;
    15 int num;
    16 int x1,x2,y1,y2;
    17 int dir[4][2]={0,1,0,-1,1,0,-1,0};
    18 int BFS()
    19 {
    20     int x,y,i;
    21     queue<node>q;
    22     node cur,next;
    23     cur.x=x1;cur.y=y1;cur.step=0;
    24     q.push(cur);
    25     mark[x1][y1]=1;
    26     while(!q.empty())
    27     {
    28         cur=q.front();
    29         q.pop();
    30         if(cur.x==x2&&cur.y==y2)
    31         return cur.step;
    32         for(i=0;i<4;i++)
    33         {
    34             next.x=x=cur.x+dir[i][0];
    35             next.y=y=cur.y+dir[i][1];
    36             if(x>=1&&x<=n&&y>=1&&y<=m&&mark[x][y]==0)
    37             {
    38                 next.step=cur.step+1;
    39                 q.push(next);
    40                 mark[x][y]=1;
    41             }
    42         }
    43     }return -1;
    44 }
    45 void DFS(int x,int y,int c_step)
    46 {
    47     if(x==x2&&y==y2&&c_step==min_step)
    48     {
    49         num++;
    50         return ;
    51     }
    52     if((x>x2?x-x2:x2-x)+(y>y2?y-y2:y2-y)+c_step>min_step)return;
    53     int i;
    54     for(i=0;i<4;i++)
    55     {
    56         int xx,yy;
    57         xx=x+dir[i][0];
    58         yy=y+dir[i][1];
    59         if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&map[xx][yy]==0)
    60         {
    61             map[xx][yy]=1;
    62             DFS(xx,yy,c_step+1);
    63             map[xx][yy]=0;
    64         }
    65     }
    66 }
    67 int main()
    68 {
    69     while(~scanf("%d%d%d",&n,&m,&k))
    70     {
    71         int i;
    72         memset(mark,0,sizeof(mark));
    73         memset(map,0,sizeof(map));
    74         for(i=1;i<=k;i++)
    75         {
    76             int a,b;cin>>a>>b;
    77             map[a][b]=1;
    78             mark[a][b]=1;
    79         }
    80         cin>>x1>>y1;
    81         cin>>x2>>y2;
    82         min_step=-1;
    83         min_step=BFS();
    84         if(min_step==-1)
    85         cout<<"No Solution!"<<endl;
    86         else
    87         {
    88             num=0;
    89             DFS(x1,y1,0);
    90             cout<<min_step<<endl;
    91             cout<<num<<endl;
    92         }
    93     }return 0;
    94 }
  • 相关阅读:
    点击子窗体给父窗体上的对象赋值
    框架使用及规范参考
    像Google日历一样的日程管理
    TreeView 和 Menu 的用法
    甘特图-svg版 支持客户端事件
    js获取DropDownList的选择项
    GridView,Repeater分页控件:WebPager(开源)
    TextBox 禁止客户端输入 前台通过JS赋值 并在后台获取
    对象实体 参考标准
    以编程方式控制ScriptManager
  • 原文地址:https://www.cnblogs.com/wlc297984368/p/3270308.html
Copyright © 2011-2022 走看看