SPOJ-Grid ,水广搜easy bfs
一个水广搜我竟然纠结了这么久,三天不练手生啊,况且我快三个月没练过搜索了。。。
题意:n*m的方格,每个格子有一个数,意味着在此方格上你可以上下左右移动s[x][y]个格子,不能出界。求左上角那个格子到右下角那个格子最少需要走几步。
思路:就是一个队列广搜,开始做一时想不起要用队列,结果用dfs左改右改,还不容易调出来了结果TLE了,我知道清楚标记的话复杂度最高500^4,不T才怪。后来叫队友看了看队友说这不就是水广搜嘛,然后水之。他说的倒是提醒了我,用广搜标记,怎么标记呢,用一个二维数组表示左上角到每个格子最少步数,然后初始化为INF,这样就每次将能到达的几个点加入队列就行了,复杂度O(n)。水之。
这么水的搜索我竟然纠结了近2小时,细思恐极。
const int N=500+10;
char s[N][N];
int w[N][N],n,m;
struct node
{
int x,y;
} Node;
void bfs(int x,int y)
{
queue<node>q;
Node.x=x,Node.y=y;
q.push(Node);
while(!q.empty())
{
node tmp=q.front();
q.pop();
int xx=tmp.x,yy=tmp.y;
if(tmp.x==n-1&&tmp.y==m-1) break;
// printf("%d %d\n",tmp.x,tmp.y);
int x1=xx-(s[xx][yy]-'0'),y1=yy-(s[xx][yy]-'0');
int x2=xx+(s[xx][yy]-'0'),y2=yy+(s[xx][yy]-'0');
// printf("x1=%d x2=%d y1=%d y2=%d %d\n",x1,x2,y1,y2,s[tmp.x][tmp.y]-'0');
if(x1>=0&&x1<n&&w[x1][yy]==INF)//ио
{
w[x1][yy]=w[xx][yy]+1;
Node.x=x1,Node.y=yy;
q.push(Node);
}
if(x2>=0&&x2<n&&w[x2][yy]==INF)//об
{
w[x2][yy]=w[xx][yy]+1;
Node.x=x2,Node.y=yy;
q.push(Node);
}
if(y1>=0&&y1<m&&w[xx][y1]==INF)//вС
{
w[xx][y1]=w[xx][yy]+1;
Node.x=xx,Node.y=y1;
q.push(Node);
}
if(y2>=0&&y2<m&&w[xx][y2]==INF)//ср
{
w[xx][y2]=w[xx][yy]+1;
Node.x=xx,Node.y=y2;
q.push(Node);
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
for(int i=0; i<N; i++)
for(int j=0; j<N; j++) w[i][j]=INF;
for(int i=0; i<n; i++) scanf("%s",s[i]);
w[0][0]=0;
bfs(0,0);
if(w[n-1][m-1]==INF) printf("-1\n");
else printf("%d\n",w[n-1][m-1]);
}
return 0;
}
SPOJ-Grid ,水广搜easy bfs的更多相关文章
- nyoj 592 spiral grid(广搜)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=592 解决以下问题后就方便用广搜解: 1.将数字坐标化,10000坐标为(0,0),这样就 ...
- 深搜(DFS)广搜(BFS)详解
图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...
- 什么时候用深搜(dfs)什么时候用广搜(bfs)(转)
1.BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止.这个时候不适宜使 ...
- 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)
#include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> ...
- 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)
#include <iostream> #include <string> #include <queue> using namespace std; //表结点 ...
- 深搜(DFS)与广搜(BFS)区别
最近做了不少的搜索题,时而用到DFS时而用到BFS,这里对两种搜索方法做一个总结. 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法.简单来说 ...
- hdu 1242:Rescue(BFS广搜 + 优先队列)
Rescue Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other) Total Submis ...
- hdu 1195:Open the Lock(暴力BFS广搜)
Open the Lock Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- poj3126 Prime Path 广搜bfs
题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...
随机推荐
- mongodb sort
sort() 方法 要在 MongoDB 中的文档进行排序,需要使用sort()方法. sort() 方法接受一个文档,其中包含的字段列表连同他们的排序顺序.要指定排序顺序1和-1. 1用于升序排列, ...
- VBA小记
要放假了,可是我们,我还是煎熬! 最让人不爽的是媳妇也需要加班加点的完成一些看起来很EASY的事: 统计数据,把几个表合并…… EXCEL本人还是懂得一点点的(我不想说我是学计算机的,我怕给学计算机的 ...
- MongoDB数据清理命令
#启动mongo命令/data/liudi/mongodb/bin/mongo --port 27010 #显示数据库show dbs; #使用tps_live数据库use tps_live; #显示 ...
- POJ Washing Clothes 洗衣服 (01背包,微变型)
题意:有多种颜色的衣服,由两个人合作来洗,必须洗完一种颜色才能洗下一种,求需要多少时间能洗完. 思路:将衣服按颜色分类,对每种颜色进行01背包,容量上限是该种颜色衣服全部洗完的耗时长一半,其实就是在最 ...
- 如何计算支撑向量数(SVs)
申明:转载请注明出处. 支持向量机(SVM)是一个成熟的单分类器,常常用于对比实验中.往往需要统计支持向量数量来比较算法优劣,MATLAB有自带的SVM工具箱,用法如下: [train, test] ...
- mac 上node.js环境的安装与测试【转】
http://blog.csdn.net/baihuaxiu123/article/details/51868142 一 摘要 如何大家之前做过web服务器的人都知道,nginx+lua与现在流行的n ...
- CPP-基础:C++的new int()与new int[]
编写一个List类: class List { int length; //列表长度 int* lpInt; //列表指针 List(int size); ~List(); } List::List( ...
- iOS 优秀博客
中文 iOS/Mac 开发博客列表 GitHub 上排名前 100 的 Objective-C 项目简介 GitHub 上都有哪些值得关注学习的 iOS 开源项目? iOS开发系列文章(持续更新……) ...
- javascript变量名命名规则
1. js变量名可以包含数字,字母,$及_,不能以数字开头. 2. js变量可以使用中文,但是最好不要这么命名,以避免不必要的麻烦.
- 【Java_基础】java中的多态性
方法的重载.重写和动态链接构成了java的多态性. 1.方法的重载 同一个类中多个同名但形参有所差异的方法,在调用时会根据参数的不同做出选择. 2.方法的重写 子类中重新定义了父类的方法,有关方法重写 ...