小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】
小鼠迷宫问题
Time Limit: 1500ms Memory limit: 65536K 有疑问?点这里^_^
题目描述

请编程对于给定的小鼠的迷宫,计算小鼠a通向小鼠b的所有最短道路。
输入
每组数据的第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。
接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。
最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。
输出
每组数据输出两行,第一行是最短路长度;第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代码。
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
using namespace std;
int m,n,k,visited[][],mapx[][];
int sx,sy,ex,ey,sum,hx[];
void dfs(int ,int );
int main()
{
while(cin>>m>>n>>k)
{
memset(mapx,,sizeof(mapx));
memset(visited,,sizeof(visited));
memset(hx,,sizeof(hx));
sum=;
int i,u,v,j;
for(i=; i<=k; i++)
{
cin>>u>>v;
mapx[v][u]=;
}
cin>>sy>>sx>>ey>>ex;
dfs(sx,sy);
for(i=; i<=; i++)
if(hx[i]!=)
{
cout<<i<<endl;
cout<<hx[i]<<endl;
break;
}
if(i==)
cout<<"No Solution!"<<endl;
}
return ;
}
int h[]= {,-,,},z[]= {-,,,};
void dfs(int x,int y)
{
visited[x][y]=;
if(x==ex&&ey==y)
{
hx[sum]++;
}
sum++;
int heng,zong;
int i;
for(i=; i<=; i++)
{
heng=x+h[i];
zong=y+z[i];
if(heng<=||zong<=||heng>m||zong>n)
continue;
else
{
if(visited[heng][zong]==&&mapx[heng][zong]!=)
{
dfs(heng,zong);
}
}
}
visited[x][y]=;
sum--;
}
代码2:ac
#include<iostream>
#include<string.h>
#include<string>
#include<stdlib.h>
#include<queue>
#include<math.h>
using namespace std;
struct vode
{
int x,y,step;
};
int m,n,k,visited[][],mapx[][];
int sx,sy,ex,ey,hx[],zong,jishu,sum;
void dfs(int ,int ,int);
int bfs();
int main()
{
while(cin>>m>>n>>k)
{
memset(mapx,,sizeof(mapx));
memset(visited,,sizeof(visited));
memset(hx,,sizeof(hx));
zong=;
jishu=;
sum=;
int i,u,v;
for(i=; i<=k; i++)
{
cin>>u>>v;
mapx[v][u]=;
}
cin>>sy>>sx>>ey>>ex;
zong=bfs();
if(zong==-)
{
cout<<"No sulution!"<<endl;
continue;
}
else
{
memset(visited,,sizeof(visited));
dfs(sx,sy,sum);
cout<<zong<<endl;
cout<<jishu<<endl;
}
}
return ;
}
int h[]= {,-,,},z[]= {-,,,};
int bfs()
{
int i,heng,zong;
queue<struct vode>que;
struct vode q;
q.x=sx;
q.y=sy;
q.step=;
que.push(q);
int flag=;
while(!que.empty())
{
q=que.front();
for(i=; i<=; i++)
{
heng=q.x+h[i];
zong=q.y+z[i];
if(heng<=||zong<=||heng>ex||zong>ey)
continue;
else if(visited[heng][zong]==&&mapx[heng][zong]==)
{
visited[heng][zong]=;
if(heng==ex&&zong==ey)
{
flag=;
break;
}
else
{
struct vode p;
p.x=heng;
p.y=zong;
p.step=q.step+;
que.push(p);
}
}
}
if(flag==)
break;
que.pop();
}
if(que.empty()&&flag==)return -;
else return que.front().step;
}
void dfs(int x,int y,int sum)
{
if(x==ex&&y==ey&&sum==zong)
{
jishu++;
return ;
}
if(fabs(x-ex)+fabs(y-ey)+sum>zong)return ;
int i,heng,zong;
for(i=; i<=; i++)
{
heng=x+h[i];
zong=y+z[i];
if(heng>m||zong>n||heng<=||zong<=)
continue;
else
{
if(visited[heng][zong]==&&mapx[heng][zong]==)
{
visited[heng][zong]=;
dfs(heng,zong,sum+);
visited[heng][zong]=;
}
}
}
}
小鼠迷宫问题【sdut1157】【dfs,bfs综合题目】的更多相关文章
- ytu 1980:小鼠迷宫问题(DFS 深度优先搜索)
小鼠迷宫问题 Time Limit: 2 Sec Memory Limit: 64 MB Submit: 1 Solved: 1 [Submit][Status][Web Board] Desc ...
- 【DFS/BFS】NYOJ-58-最少步数(迷宫最短路径问题)
[题目链接:NYOJ-58] 经典的搜索问题,想必这题用广搜的会比较多,所以我首先使的也是广搜,但其实深搜同样也是可以的. 不考虑剪枝的话,两种方法实践消耗相同,但是深搜相比广搜内存低一点. 我想,因 ...
- FOJ1205 小鼠迷宫问题 (BFD+递推)
FOJ1205 小鼠迷宫问题 (BFD+递推) 小鼠a与小鼠b身处一个m×n的迷宫中,如图所示.每一个方格表示迷宫中的一个房间.这m×n个房间中有一些房间是封闭的,不允许任何人进入.在迷宫中任何位置均 ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
- ID(dfs+bfs)-hdu-4127-Flood-it!
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4127 题目意思: 给n*n的方格,每个格子有一种颜色(0~5),每次可以选择一种颜色,使得和左上角相 ...
- [LeetCode] 130. Surrounded Regions_Medium tag: DFS/BFS
Given a 2D board containing 'X' and 'O' (the letter O), capture all regions surrounded by 'X'. A reg ...
- HDU 4771 (DFS+BFS)
Problem Description Harry Potter has some precious. For example, his invisible robe, his wand and hi ...
- POJ 3083 -- Children of the Candy Corn(DFS+BFS)TLE
POJ 3083 -- Children of the Candy Corn(DFS+BFS) 题意: 给定一个迷宫,S是起点,E是终点,#是墙不可走,.可以走 1)先输出左转优先时,从S到E的步数 ...
- [LeetCode]695. 岛屿的最大面积(DFS/BFS)、200. 岛屿数量(DFS/BFS待做/并差集待做)
695. 岛屿的最大面积 题目 给定一个包含了一些 0 和 1的非空二维数组 grid , 一个 岛屿 是由四个方向 (水平或垂直) 的 1 (代表土地) 构成的组合.你可以假设二维矩阵的四个边缘都被 ...
随机推荐
- qt-4.8.5 显示图片居中笔记
已经太久没有写过qt的程序了,所以导致的后果就是一个很简单的程序写了老半天还没写完整. 今天想实现的功能在原来软件的基础上显示他的版本. 因为想在该界面显示一个logo,一开始在pc机上跑发现图片一直 ...
- 使用srvany.exe将任何程序作为Windows服务运行
使用srvany.exe将任何程序作为Windows服务运行 2011 年 3 月 7 日 !本文可能 超过1年没有更新,今后内容也许不会被维护或者支持,部分内容可能具有时效性,涉及技术细节或者软件使 ...
- 网络数据包发送工具PacketSender中文源码
在网上发现了一个好用的工具PacketSender,数据包发送器.对于写网络程序来说,有很大的便利性.虽然在linux下,netcat工具也很好用,但是这个也不错. 原本是英文的,给翻译了一下.这是基 ...
- Objective C 快速入门学习三
1.数据类型 和C语言基本一样. 有一个特别数据类型id,可以储存任何类型的对象,它是实现多态和动态绑定的基础. Objective-C 2.程序结构 Objective-C和C的程序结构一模一样,具 ...
- nova 虚拟机迁移
ref: 官方文档很给力: nova 迁移有以下类型: Non-live migration (sometimes referred to simply as ‘migration’). The in ...
- Python之多线程
廖雪峰教程--- http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/00138683 ...
- sql语句操作
1.1 SQL语句 1.1.1 什么是SQL SQL:Structured Query Language, 结构化查询语言. 特点: * 非过程性语言: * 过程性语言特点:一个语句需要依赖上面的几条 ...
- Java中的try,catch(Exception e),finally及return执行顺序
结论: ①就算之前return,finally也会执行 ②finally的计算结果不影响之前的return值 ③finally的return值一定是最后的返回结果,因此将return放入finally ...
- Pythonj~module
常数,变量 特殊变量:__xxx__ 可以被直接引用 private函数:_xxx __xxx__ 外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public. 导入 ...
- Effective C++ -----条款32:确定你的public继承塑模出is-a关系
“public继承”意味is-a.适用于base classes身上的每一件事情一定也适用于derived classes身上,因为每一个derive class对象也都是一个base class对象 ...