SERGRID - Grid

一个水广搜我竟然纠结了这么久,三天不练手生啊,况且我快三个月没练过搜索了。。。

题意: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的更多相关文章

  1. nyoj 592 spiral grid(广搜)

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=592 解决以下问题后就方便用广搜解: 1.将数字坐标化,10000坐标为(0,0),这样就 ...

  2. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  3. 什么时候用深搜(dfs)什么时候用广搜(bfs)(转)

    1.BFS是用来搜索最短径路的解是比较合适的,比如求最少步数的解,最少交换次数的解,因为BFS搜索过程中遇到的解一定是离根最近的,所以遇到一个解,一定就是最优解,此时搜索算法可以终止.这个时候不适宜使 ...

  4. 图的基本操作(基于邻接矩阵):图的构造,深搜(DFS),广搜(BFS)

    #include <iostream> #include <stdio.h> #include <cstdlib> #include <cstring> ...

  5. 图的基本操作(基于邻接表):图的构造,深搜(DFS),广搜(BFS)

    #include <iostream> #include <string> #include <queue> using namespace std; //表结点 ...

  6. 深搜(DFS)与广搜(BFS)区别

    最近做了不少的搜索题,时而用到DFS时而用到BFS,这里对两种搜索方法做一个总结. 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法.简单来说 ...

  7. hdu 1242:Rescue(BFS广搜 + 优先队列)

    Rescue Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submis ...

  8. hdu 1195:Open the Lock(暴力BFS广搜)

    Open the Lock Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. poj3126 Prime Path 广搜bfs

    题目: The ministers of the cabinet were quite upset by the message from the Chief of Security stating ...

随机推荐

  1. Android线程池(转)

    .前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用, ...

  2. 利用js日期控件重构WEB功能

    开发需求:网页中的日期部门(注册页面和查询条件)都用js日期控件重写 页面一:更新员工页面 empUpdate.jsp 中增加 onfocus 事件 入职日期:<input id="h ...

  3. Android学习总结(八)———— 广播的最佳实践(实现强制下线功能)

    一.基本概念 强制下线功能功能应该算是比较常见的了,很多应用程序都具备这个功能,比如你的QQ号或者微信号在别处登录了,就会将你强制挤下线.只需要在界面上弹出一个对话框,让用户无法进行任何其他的操作,必 ...

  4. SQLite基础教程目录

    SQLite基础教程目录 SQLite主页 SQLite概述 SQLite -安装 SQLite -命令 SQLite -语法 SQLite -数据类型 SQLite -创建数据库 SQLite -附 ...

  5. Codeforces Round #317 (Div. 2) C Lengthening Sticks (组合,数学)

    一个合法的三角形的充要条件是a<b+c,其中a为最长的一边,可以考虑找出所有不满足的情况然后用总方案减去不合法的情况. 对于一个给定的总长度tl(一定要分完,因为是枚举tl,不分配的长度已经考虑 ...

  6. 双击窗体是模拟键盘上的Tab键

    实现效果: 知识运用: SendKeys类的Send方法 //向活动应用程序发送击键 public static void Send (string keys) 实现代码: private void ...

  7. 理解 React,但不理解 Redux,该如何通俗易懂的理解 Redux?(转)

    作者:Wang Namelos 链接:https://www.zhihu.com/question/41312576/answer/90782136来源:知乎 解答这个问题并不困难:唯一的要求是你熟悉 ...

  8. spring-security中的csrf防御机制(跨域请求伪造)

    什么是csrf? csrf又称跨域请求伪造,攻击方通过伪造用户请求访问受信任站点.CSRF这种攻击方式在2000年已经被国外的安全人员提出,但在国内,直到06年才开始被关注,08年,国内外的多个大型社 ...

  9. EOF与feof

    在C语言中,或更精确地说成C标准函数库中表示文件结束符(end of file).在while循环中以EOF作为文件结束标志,这种以EOF作为文件结束标志的文件,必须是文本文件.在文本文件中,数据都是 ...

  10. shell脚本调试打印日志问题

    shell脚本调试打印日志问题 1. 需求 我们在编写脚本的时候,有时候需要做调试,便于我们定位问题,有时候等脚本上线之后,我们需要保留脚本执行过程中的记录.便于我们在出问题的时候,定位问题. 2. ...