http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=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
题目大意:在一个迷宫内输出位置a到位置b的最短距离,以及一共有多少种不同的最短路径数。
分析:利用bfs可以计算出最短路径的距离,然后用dfs计算出等于有多少种不同的最短路径。
题目解析:
通过做这题,发现对算法的思想很渣渣,拿到题简直无法先手,有点弄混bfs与dfs,
bfs可以求最短路,但无法求最短路径的数目,但dfs 不同,它通过不断的回溯与查找,可以
遍历所有的情况。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <queue>
using namespace std;
char map[][];
int v[][];
struct node
{
int ans,x,y;
};
struct node t,f;
int a[],b[];
int fx[]= {,-,,};
int fy[]= {,,,-};
int n,m,k,flag,sum;
void bfs()
{
queue<node>q;
memset(v,,sizeof(v));
t.x=a[];
t.y=a[];
t.ans=;
q.push(t);
v[a[]][a[]]=;
while(!q.empty())
{
t=q.front();
q.pop();
if(t.x==b[]&&t.y==b[])
{
printf("%d\n",t.ans);
flag=t.ans;
return ;
}
for(int i=; i<; i++)
{
f.x=t.x+fx[i];
f.y=t.y+fy[i];
if(f.x>=&&f.x<=n&&f.y>=&&f.y<=m&&v[f.x][f.y]==&&map[f.x][f.y]!=)
{
f.ans=t.ans+;
v[f.x][f.y]=;
q.push(f);
}
}
}
printf("No Solution!\n");
return ;
}
void dfs(int xx,int yy,int ans)
{
int tx,ty;
if(xx==b[]&&yy==b[]&&ans==flag)
{
sum++;
}
if(xx>b[]||yy>b[]||ans>=flag) return ;
for(int i=; i<; i++)
{
tx=xx+fx[i];
ty=yy+fy[i];
if(tx>=&&tx<=n&&ty>=&&ty<=m&&v[tx][ty]==&&map[tx][ty]!=&&ans<flag)
{
v[tx][ty]=;
dfs(tx,ty,ans+);
v[tx][ty]=;
}
}
}
int main()
{
int xx,yy;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
flag=;
sum=;
memset(map,,sizeof(map));
for(int i=; i<=k; i++)
{
scanf("%d%d",&xx,&yy);
map[xx][yy]=;
}
scanf("%d%d",&a[],&a[]);
scanf("%d%d",&b[],&b[]);
bfs();
if(flag==) continue;
memset(v,,sizeof(v));
v[a[]][a[]]=;
dfs(a[],a[],);
printf("%d\n",sum);
}
return ;
}

SDUT1157:小鼠迷宫问题(bfs+dfs)的更多相关文章

  1. ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)

     小鼠迷宫问题 Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 1  Solved: 1 [Submit][Status][Web Board] Desc ...

  2. [Swust OJ 409]--小鼠迷宫问题(BFS+记忆化搜索)

    题目链接:http://acm.swust.edu.cn/problem/409/ Time limit(ms): 1000 Memory limit(kb): 65535   Description ...

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

    小鼠迷宫问题 Time Limit: 1500ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中 ...

  4. FOJ1205 小鼠迷宫问题 (BFD+递推)

    FOJ1205 小鼠迷宫问题 (BFD+递推) 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均 ...

  5. POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)

    思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...

  6. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  7. Collect More Jewels(hdu1044)(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  8. Cleaning Robot (bfs+dfs)

    Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...

  9. LeetCode:BFS/DFS

    BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...

随机推荐

  1. Qt——文件对话框

    教程:https://www.devbean.net/2012/09/qt-study-road-2-file-dialog/ 代码如下: //mainwindow.h #ifndef MAINWIN ...

  2. 【技术分享会】 @第三期 CSS框架 PRUE 实现自适应和响应式

    Pure网址:https://purecss.cn/ 什么是响应式和自适应? .响应式:样式会随着屏幕大小改变,同一页面设备不同样式不同 .自适应:不管屏幕大小,页面的样式比例不变 响应式和自适应怎么 ...

  3. 线程同步之ManualResetEvent类的用法

    笔者的一台激光测厚设备的软件, 它有一个运动线程, 一个激光数据处理线程. 运动线程做的事就是由A点移动到B点, 然后再由B点移动回A点. 激光处理线程要做的事就是采集指定数量点的激光数据, 随着采集 ...

  4. Java初学者都必须理解的六大问题 (整理自网络)

    问题一:我声明了什么! 1. String s = "Helloworld!"; 许多人都做过这样的事情,但是,我们到底声明了什么?回答通常是:一个String,内容是“Hello ...

  5. sencha touch 侧边栏扩展(只隐藏不销毁)

    基于Ext.ux.MenuButton改造而来,和它不同的是,不会每次都去销毁侧边栏,只是单纯的隐藏,属性配置方面没啥区别,每次点击按钮显示时,会触发showMenu事件/方法 代码如下: /** * ...

  6. 获取Web.config的内容

    <web.config> web.config文件是一个XML文件,它的根结点是<configuration>,在<configuration>节点下的常见子节点有 ...

  7. [转]Android中attr自定义标签详解

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:wen= ...

  8. Linux at 定时任务

    命令格式:at[参数][时间]  请注意系统时间是UTC 命令功能:在一个指定的时间执行一个指定任务,只能执行一次.假如该时间已过去,那么就放在第二天执行. /var/spool/mail/这里是任务 ...

  9. MongoDB 日记参数

    MongoDB中主要有四种日志.分别是系统日志.Journal日志.oplog主从日志.慢查询日志等.这些日志记录着Mongodb数据库不同方便的踪迹.下面分别介绍这四种日志: 1.系统日志 系统日志 ...

  10. ch 与等宽字体

    难题 有的时候,特别想通过字符来判断元素的长度,比如: 多行文本溢出时,文字变省略号 文字一个个的显示 效果分别如下: 第一种情况下,如果可以通过字符的数量判断长度是否溢出,从而把最后几个字符替换成省 ...