FOJ1205 小鼠迷宫问题 (BFD+递推)
FOJ1205 小鼠迷宫问题 (BFD+递推)
小鼠a与小鼠b身处一个m×n的迷宫中,如图所示。每一个方格表示迷宫中的一个房间。这m×n个房间中有一些房间是封闭的,不允许任何人进入。在迷宫中任何位置均可沿上,下,左,右4个方向进入未封闭的房间。小鼠a位于迷宫的(p,q)方格中,它必须找出一条通向小鼠b所在的(r,s)方格的路。请帮助小鼠a找出所有通向小鼠b的最短道路。
图 小鼠的迷宫
编程任务:
对于给定的小鼠的迷宫,编程计算小鼠a通向小鼠b的所有最短道路。
INPUT:
由文件input.txt给出输入数据。第一行有3个正整数n,m,k,分别表示迷宫的行数,列数和封闭的房间数。接下来的k行中,每行2个正整数,表示被封闭的房间所在的行号和列号。最后的2行,每行也有2个正整数,分别表示小鼠a所处的方格(p,q)和小鼠b所处的方格(r,s)。
OUTPUT:
将计算出的小鼠a通向小鼠b的最短路长度和有多少条不同的最短路输出到文件output.txt。文件的第一行是最短路长度。文件的第2行是不同的最短路数。
如果小鼠a无法通向小鼠b则输出“No Solution!”。
|
input.txt |
output.txt |
|
8 8 3 3 3 4 5 6 6 2 1 7 7 |
11 96 |
解题报告
看到这个题目,首先给人的第一感觉就是用BFS。初始障碍不能走为-1,一个点向四周扩散。 在数组g上保留广搜的痕迹,即走到每个格子的最短距离。至于路径条数,可以用递推来求。如果一个格子的相邻为其距离减一,即代表这个格子可由其走到。故其方案数为其四周满足的格子的方案数总和。初始起点为1.输出终点即可。算法复杂度为O(n+m)
附上代码
#include<bits/stdc++.h>
#define Pair pair<int,int>
#define MAXN 100000+1
#define MAXM 2000000+1
using namespace std;
int g[][],ans[][],n,m,k,s1,s2,e1,e2,qq;
struct Data{
int x,y,dis;
};
Data make(int x,int y,int dis)
{
Data j;j.x=x;j.y=y;j.dis=dis;
return j;
}
void bfs()
{
queue <Data> h;
Data temp;temp.x=s1;temp.y=s2;temp.dis=;
g[s1][s2]=;
h.push(temp);
while(h.size()>)
{
Data t=h.front();h.pop(); if(t.x>&&g[t.x-][t.y]!=-&&g[t.x-][t.y]==)
{h.push(make(t.x-,t.y,t.dis+));g[t.x-][t.y]=t.dis+;} if(t.y>&&g[t.x][t.y-]!=-&&g[t.x][t.y-]==)
{h.push(make(t.x,t.y-,t.dis+));g[t.x][t.y-]=t.dis+;} if(t.x<n&&g[t.x+][t.y]!=-&&g[t.x+][t.y]==)
{h.push(make(t.x+,t.y,t.dis+));g[t.x+][t.y]=t.dis+;} if(t.y<m&&g[t.x][t.y+]!=-&&g[t.x][t.y+]==)
{h.push(make(t.x,t.y+,t.dis+));g[t.x][t.y+]=t.dis+;}
if(g[e1][e2]!=)
{
printf("%d\n",g[e1][e2]-);
break;
}
}
}
int answer(int x,int y)
{
if(ans[x][y]==)
{
int a=,b=,c=,d=;
if(g[x-][y]+==g[x][y]) a=answer(x-,y),ans[x][y]+=a,a=; if(g[x][y-]+==g[x][y]) b=answer(x,y-),ans[x][y]+=b,b=; if(g[x+][y]+==g[x][y]) c=answer(x+,y),ans[x][y]+=c,c=; if(g[x][y+]+==g[x][y]) d=answer(x,y+),ans[x][y]+=d,d=; return ans[x][y];
}else
return ans[x][y];
} int main()
{ scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=k;i++)
{
int x,y;
scanf("%d%d",&x,&y);
g[x][y]=-;
}
scanf("%d%d%d%d",&s1,&s2,&e1,&e2);
bfs();
ans[s1][s2]=;
answer(e1,e2);
printf("%d\n",ans[e1][e2]); return ;
}
FOJ1205 小鼠迷宫问题 (BFD+递推)的更多相关文章
- 【BZOJ-2476】战场的数目 矩阵乘法 + 递推
2476: 战场的数目 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 58 Solved: 38[Submit][Status][Discuss] D ...
- 从一道NOI练习题说递推和递归
一.递推: 所谓递推,简单理解就是推导数列的通项公式.先举一个简单的例子(另一个NOI练习题,但不是这次要解的问题): 楼梯有n(100 > n > 0)阶台阶,上楼时可以一步上1阶,也可 ...
- Flags-Ural1225简单递推
Time limit: 1.0 second Memory limit: 64 MB On the Day of the Flag of Russia a shop-owner decided to ...
- 利用Cayley-Hamilton theorem 优化矩阵线性递推
平时有关线性递推的题,很多都可以利用矩阵乘法来解决. 时间复杂度一般是O(K3logn)因此对矩阵的规模限制比较大. 下面介绍一种利用利用Cayley-Hamilton theorem加速矩阵乘法的方 ...
- 【66测试20161115】【树】【DP_LIS】【SPFA】【同余最短路】【递推】【矩阵快速幂】
还有3天,今天考试又崩了.状态还没有调整过来... 第一题:小L的二叉树 勤奋又善于思考的小L接触了信息学竞赛,开始的学习十分顺利.但是,小L对数据结构的掌握实在十分渣渣.所以,小L当时卡在了二叉树. ...
- 简单递推 HDU-2108
要成为一个ACMer,就是要不断学习,不断刷题...最近写了一些递推,发现递推规律还是挺明显的,最简单的斐波那契函数(爬楼梯问题),这个大家应该都会,看一点稍微进阶了一点的,不是简单的v[i] = v ...
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- openjudge1768 最大子矩阵[二维前缀和or递推|DP]
总时间限制: 1000ms 内存限制: 65536kB 描述 已知矩阵的大小定义为矩阵中所有元素的和.给定一个矩阵,你的任务是找到最大的非空(大小至少是1 * 1)子矩阵. 比如,如下4 * 4的 ...
随机推荐
- 编译Speex生成so库文件(android-speex)
项目中需要用音频格式转换,之前使用VoAacEncoder,部分手机总是莫名崩溃,所以决定不再使用VoAacEncoder,换做Speex来完成格式转换,但是没有找到Speex的库文件,网上介绍的都是 ...
- Timer 的 schedule()方法
1.timer.schedule(new MyTask(),long time1,long time2); 第一个参数是TimerTask类,使用者要继承该类,并实现run()方法,因为TimerTa ...
- kindEditor编写插件遇到的问题
kindEditor是一个功能强大的在线文本编辑器,而且提供了插件扩展功能,更好的满足用户各方面的需求.在项目中,我们就有如此的需求:在kindEditor编辑器中,添加一条下划线,并且在下划线的中间 ...
- STM8S103 解决Rom空间不足 & Map文件分析
STM8S103只有8KRom,很容易造成空间不足.对于空间不足,我们就要从map文件着手分析,究竟哪些函数占了多少空间,map文件分为几部分:Segments(总括了各个段所占的空间), Modul ...
- jq 鼠标点击跳转页面后 改变点击菜单的样式代码
点击菜单跳转页面,然而跳转后的页面字体并没有加粗用如下代码 <div class="bg01 menu"> <img class="img01" ...
- 优动漫PAINT中误删工具怎么办?
最近收到一些小伙伴的提问,说我不小心把 XXX工具从面板上删掉了怎么办?本教程就来给大家分 享一下遇到这个问题时的三种解决方法,遇到同样问题的小伙伴们赶紧进来看一下哟! 优动漫PAINT下载:http ...
- IPv6理论知识详解
1. IPv6地址表示 IPv6地址可以表示为128位由0.1组成的字符串,为了便于计算机理解,将128位的二进制字符串表示为32位的十六进制字符串,为了便于理解,人们将其划分为8组,组与组之间用 : ...
- 【BZOJ3678】Wangxz和OJ
题意: 不想讲 题解: Rope真香! 正解是Splay缩点,访问时再拆成一个序列 代码: //STL dafa good! #include<algorithm> #include< ...
- 用centos镜像 制作本地yum源
1.上传iso镜像 2.挂载镜像到相应目录 mkdir /yumiso #创建目录mount -t iso9660 /dev/cdrom/sr0 /yumiso #挂载镜像文件到对应目录 3.备份旧的 ...
- 学习参考:《Python语言及其应用》中文PDF+英文PDF+代码
学习简单的数据类型,以及基本的数学和文本操作,学习用Python内置的数据结构来处理数据: 掌握Python的代码结构和函数的用法:使用模块和包编写大规模Python程序:深入理解对象.类和其他面向对 ...