POJ 3271 BFS (大坑)
被某人拉进了坑 完完全全被坑一天的题……
题意:
正解思路:
先把每一个点搜一遍 预处理出它能在一步之内到的所有点 并连边
然后用一个类似DP的东西把方案数加起来就搞定了
(其实 也不是很难)
但是
我为什么会挂呢
首先 我想偷个懒,想少写一个BFS 就直接按照原来的边搜过去了
当然错了
查了一上午
(对着数据查 小数据竟然全水过去了!!!)
下午颓了会儿
没发现错,,,,,,
晚上在车上的时候 思考人生
诶呦woc?
有荷叶的时候路径不能简单的加和!
要搞定所有的新边
回家以后 乖乖写了第二个BFS 秒切…….
以下是把我拉近坑的那个人的题解:
所以基本思路 搜索 从起点到原点的路径 是水面的就加1。
所以稍微处理了一下,预处理每一个点的需要加1个荷叶的点。1个就好
然后从原点bfs一遍,遇到可以更新的点即 长度大于新的。就把ans从新赋值并且push进去,如果等于就ans【v】+=ans【u】
所以puts答案就好了。
上午一支不对主要在于。一开始的荷叶处理,我想dfs的搜就有可能绕远了,但是其实每个点是可以重复经过的。可是不加vis就会跪。不如循环着 预处理一下每一个点
看起来她很机智嘛
//By SiriusRen
#include <queue>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,a[33][33],dis[999],sp,ep;
long long ans[999];
int xx[]={2,2,1,1,-1,-1,-2,-2},yy[]={1,-1,2,-2,2,-2,1,-1};
int first[999],next[99999],v[99999],tot;
bool check(int x,int y){return x>=1&&x<=n&&y>=1&&y<=m&&a[x][y]!=2;
}
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;
}
void BFS(int X,int Y){int vis[33][33];memset(vis,0,sizeof(vis));queue<pair<int,int> >q;q.push(make_pair(X,Y)),vis[X][Y]=1;while(!q.empty()){int x=q.front().first,y=q.front().second;q.pop();for(int i=0;i<8;i++){int dx=x+xx[i],dy=y+yy[i];if(check(dx,dy)&&!vis[dx][dy]){vis[dx][dy]=1;if(a[dx][dy]==1)q.push(make_pair(dx,dy));else add(X*m+Y,dx*m+dy);}}}
}
void bfs(){queue<int>q;q.push(sp);memset(dis,0x3f,sizeof(dis));dis[sp]=0,ans[sp]=1;while(!q.empty()){int t=q.front();q.pop();for(int i=first[t];~i;i=next[i]){if(dis[v[i]]>dis[t]+1){dis[v[i]]=dis[t]+1;ans[v[i]]=ans[t];q.push(v[i]);}else if(dis[v[i]]==dis[t]+1)ans[v[i]]+=ans[t];}}
}
int main(){memset(first,-1,sizeof(first));scanf("%d%d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){scanf("%d",&a[i][j]);if(a[i][j]==3)sp=i*m+j;else if(a[i][j]==4)ep=i*m+j;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)BFS(i,j);bfs();if(dis[ep]<=0x3fffff)printf("%d\n%lld",dis[ep]-1,ans[ep]);else puts("-1");
}
转载于:https://www.cnblogs.com/SiriusRen/p/6532252.html
POJ 3271 BFS (大坑)相关推荐
- poj 3271 Lilypad Pond bfs
因为有了1的存在,使得问题变得比较难搞了,所以比较简单的做法就是把1去掉,先做一次bfs,处理出每个点能够一步到达的点(一定是1步). 然后就可以在新图上用bfs算出两个点之间的最短路,和最短路的个数 ...
- POJ - 3026(BFS+最小生成树.krustal)
题目: 题目链接: http://poj.org/problem?id=3026 Borg Maze Time Limit: 1000MS Memory Limit: 65536K Total S ...
- POJ 3322 BFS
题意 传送门 POJ 3322 Bloxorz I 题解 长方体当前的状态为其横.纵坐标与摆放状态组成的三元组,为了方便表示,只取长方体左上方的位置作为横.纵坐标状态,BFSBFSBFS 求解即可. ...
- POJ - 3984+POJ - 3414(BFS+路径记录)
题目一 迷宫问题 题目链接: http://poj.org/problem?id=3984 题目: Description 定义一个二维数组: int maze[5][5] = {0, 1, 0, 0 ...
- poj 1426 BFS
一个数n,求一个数m,m由0和1构成,且是n的倍数,若存在多个可任意输出一个即可 数字不会超过19位,用long long int保存. #pragma warning(disable:4996) # ...
- poj 3126 BFS
BFS得到的一定是最短路径.开始我还在纠结怎么才是最短的呢.其实BFS的题目有个共性(这不废话,哪一类题没有共性啊.呵呵).以后做这种题自己慢慢总结吧. 这题的思路就是写枚举出4位数的所有prime ...
- Borg Maze POJ - 3026 (BFS + 最小生成树)
题意: 求把S和所有的A连贯起来所用的线的最短长度... 这道题..不看discuss我能wa一辈子... 输入有坑... 然后,,,也没什么了...还有注意 一次bfs是可以求当前点到所有点最短距离 ...
- POJ 2457 BFS
题意: 说人话: 从A到B连边 找从1到k的最短路 并输出路径(随便一条即可 ) 如果不能到达 输出-1 思路: 搜 //By SiriusRen #include <queue> #in ...
- Dungeon Master POJ - 2251 BFS
一.内容 题意:给定一个3D的图,你能走6个方向,问从起点到终点最少的步数. 二.思路 bfs搜索一下. 三.代码 #include <cstdio> #include <cstri ...
最新文章
- java中 set,list,array(集合与数组)相互转换
- 魔幻的“净醛产品”:宜家被罚“亡羊”,欧派用视频“补牢”?
- P1313 计算系数(组合数)
- eclipse打开出错 Error: opening registry key 'Software\JavaSoft\Java Runtime Environment'
- java 集合迭代器_Java中的集合迭代器
- http://blog.csdn.net/evankaka/article/details/45155047
- Julia语言初体验
- React Native 入门第一篇
- Java 中的线程管理概念梳理
- Linux c 多线程写日志,linux c/c++多线程程序的编写(转)
- mysql让数据-1_mysql数据库基本操作1
- TensorFlow进阶:车牌号识别项目
- Linux定时任务-Cron表达式详解
- Python书单推荐
- 在线供应链系统服务方案:构建企业供应链平台业务、功能、技术管理架构
- electron 双击放大事件
- 3w最简单led灯电路图_怎么选择自己合适的LED驱动IC?(十大LED驱动IC典型应用电路图)...
- 需要很多邮箱怎么办?分享几个不错的办法可无限安全生成多个邮箱
- 大数据框架基础Hive安装
- Linux/macOS 命令符列表
热门文章
- oracle oui25031 linux,搭建Oracle 10g RAC过程中出现 OUI-25031 的解决办法
- HR8P506,时钟配置,一切从内部时钟HRC开始.
- shell模板变量替换
- 一步步学习电子维修 二极管挡维修法
- 外贸中英繁三语企业网站管理系统 v2020.6.23
- 网络策划方案怎么写?分享一个品牌策划方案撰写方法
- 可视化神器Plotly玩转股票图
- 个人收集的网站,可以参考(程序员可收藏)
- iOS开发好不好学?
- nikebot NIKE AKAMAI BOT NIKE监控 nike补货监控 nike抽签 snrks