POJ 3271 BFS (大坑)
来源:互联网 发布:知行理工初始密码 编辑:程序博客网 时间:2024/06/06 12:07
被某人拉进了坑 完完全全被坑一天的题……
题意:
正解思路:
先把每一个点搜一遍 预处理出它能在一步之内到的所有点 并连边
然后用一个类似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");}
0 0
- POJ 3271 BFS (大坑)
- POJ-2056(BFS)
- POJ-1198(BFS)
- POJ 3984(bfs)
- POJ 3278(BFS)
- POJ 3126 (BFS)
- POJ 3414 (BFS)
- POJ 2251(BFS)
- poj 2415(BFS)
- POJ 1101(BFS)
- POJ - 3278(BFS)
- POJ 3278(bfs)
- poj 3271 Lilypad Pond bfs
- POJ-3697(hash+bfs)
- poj Dungeon Master(Bfs)
- POJ 3414 Pots (BFS)
- poj 1376 Robot (BFS)
- POJ-2157(floodfill + BFS)
- Hybrid computing using a neural network with dynamic external memory(可微神经计算机)阅读
- C3P0替代hibernate管理连接池
- 读书笔记之:鸟哥Linux私房菜(基础篇)
- POJ 3265 DP
- MySql DOS中操作的常用SQL语句
- POJ 3271 BFS (大坑)
- 网桥帧的转发与转发表的建立算法
- [C++]前置声明和头文件
- TensorFlow白皮书读后感
- 停止等待协议的算法
- BZOJ 2748 DP
- BZOJ 1193 搜索+贪心
- 载波侦听多点接入/碰撞检测(CSMA/CD协议)
- DateFormat在linux下系统和windows系统下取值不同的问题