hdoj 1175 (bfs)
题意:
判断两点之间是否可以通过至多有两次转变方向以达到相连,就是平时玩的连连看游戏,但是不能从外面绕过去。
思路:bfs,给每个加入的队列的点添加转变方向次数turn和点当前要走的方向dir属性,起点可以走四个方向。
参照代码来源:
我的代码,参照写得,加深练习和理解:
#include <iostream>
#include <cstring>
#include <queue>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int M = ;
int map[M][M];
int has[M][M];
struct node
{
int x,y;
int turn;
int dir;
};
int dire[][] = {{,},{,},{,-},{-,}};
queue <node> q;
int n,m;
int sx,sy,ex,ey;
struct node st;
bool flag;
inline bool in(const node &p)
{
if ((p.x< || p.y< || p.x>=n || p.y>=m))
return false;
return true;
}
void bfs()
{
node now,t;
while (!q.empty())
{
now = q.front();
q.pop();
//cout << now.x << " " << now.y << " " << now.turn << " " << now.dir <<endl;
if (now.x == ex && now.y == ey && now.turn<=) //满足条件退出
{
flag = true;
return;
}
for (int i = ; i < ; i++)
{
if((now.dir+)% == i) continue;
t.x=now.x+dire[i][],t.y=now.y+dire[i][];
if(i == now.dir) //now的点和下一个走的点的方向相同
t.turn=now.turn,t.dir=now.dir;
else
t.turn=now.turn+,t.dir=i;
//if ((t.x>=0 && t.x < n && t.y>=0 && t.y<m) && (map[t.x][t.y] == 0|| (t.x == ex&&t.y == ey))&& (has[t.x][t.y]>=t.turn)) //如果不用in()函数的话我之前是这么写的
if (in(t) && (map[t.x][t.y] == || (t.x == ex && t.y == ey))&& (has[t.x][t.y]>=t.turn) && t.turn <= ) // 加入队列条件
{
has[t.x][t.y] = t.turn;
q.push(t);
}
}
}
} int main()
{
while (cin >> n >> m && n && m)
{
for (int i = ;i < n;i++)
{
for (int j = ;j < m;j++)
cin >> map[i][j];
}
int tt;
cin >> tt;
for (int i = ;i < tt;i++)
{
cin >> sx >> sy >> ex >> ey;
sx--,sy--,ex--,ey--;
//printf("%d %d %d %d\n",sx,sy,ex,ey);
if ((sx == ex && sy == ey)|| map[sx][sy] == || map[ex][ey] == ||map[sx][sy] != map[ex][ey]) //判断输入的两点是否合法:是否相等,是否为0...
{
puts("NO");
continue;
}
for (int i = ;i < n;i++)
for (int j = ;j < m;j++)
has[i][j] = ;
while(!q.empty())
q.pop();
for (int i = ;i < ;i++)
{
st.x = sx,st.y = sy,st.turn = ,st.dir = i; //起点的四个方向都要加入队列
q.push(st);
}
has[sx][sy] = ;
flag = false;
bfs();
if(flag)
cout << "YES\n";
else cout << "NO\n";
}
}
return ;
}
hdoj 1175 (bfs)的更多相关文章
- hdu 1175(BFS&DFS) 连连看
题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...
- HDU - 1175 bfs
思路:d[x][y][z]表示以z方向走到(x, y)的转弯次数. 如果用优先队列会超时,因为加入队列的节点太多,无用的节点不能及时出队,会造成MLE,用单调队列即可. AC代码 #include & ...
- hdu 1175 bfs+priority_queue
连连看 如上图所示如果采用传统bfs的话,如果按照逆时针方向从(1,1)-->(3,4)搜索,会优先选择走拐四次弯的路径导致ans错误: Time Limit: 20000/10000 MS ( ...
- hdoj 1175 连连看
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- BFS(八数码) POJ 1077 || HDOJ 1043 Eight
题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...
- HDU(1175),连连看,BFS
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...
- BFS+贪心 HDOJ 5335 Walk Out
题目传送门 /* 题意:求从(1, 1)走到(n, m)的二进制路径值最小 BFS+贪心:按照标程的作法,首先BFS搜索所有相邻0的位置,直到1出现.接下去从最靠近终点的1开始, 每一次走一步,不走回 ...
- DFS/BFS+思维 HDOJ 5325 Crazy Bobo
题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...
- hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...
随机推荐
- jdbcTemplate获取mysql的blob
java使用jdbcTemplate操作mysql数据库,遇到blob字段,正常读取出来是blob的地址,而不是blob的内容. 下面采用2中方式读取blob的内容: 1.以二进制数组形式读取blob ...
- Java偏向锁实现原理(Biased Locking)
http://kenwublog.com/theory-of-java-biased-locking 阅读本文的读者,需要对Java轻量级锁有一定的了解,知道lock record, mark wor ...
- Introduce: IEPI.BIATranscribe 图像表格拓写工具
应用场合 数据表格是学术.文案工作中常用的表述形式.我们经常需要从第三方获取所需的数据.有些时候这些数据并非以可直接编辑的形式(如电子表格文档),而是以打印件或者扫描件的形式提供.假如需要对数据进行进 ...
- 《JAVASCRIPT高级程序设计》根植于原型链的继承
继承是面向对象的语言中,一个最为津津乐道并乐此不疲的话题之一.JAVASCRIPT中的继承,主要是依靠原型链来实现的.上一篇文章介绍过,JAVASCRIPT中,每一个对象都有一个prototype属性 ...
- linux c语言定时器
原文来自于:http://hi.baidu.com/opetrhsxszbckzd/item/126966cae5f9524aa9ba94f5 我只是把其重新排版标注一下. linux c语言定时器 ...
- MyEclipse - 解决 MyEclipse build workspace慢,validation javascript更慢的问题
在这个过程中对.projet文件进行了跟踪比对,总算发现这个Build的时候进行Validation是从哪里定义的了.似乎因为我的项目是基于ExtJS2.0.2的web project,所以会提示打开 ...
- 解决 Eclipse build workspace validation javascript 慢的问题
参考: http://blog.csdn.net/zhangzikui/article/details/24805935 http://www.cnblogs.com/wql025/p/4978351 ...
- jQuery 监听元素内容变化的方法
我们可以用onchange事件来完成元素值发生改变触发的监听.但是 onchange 比较适用于<input>.<textarea> 以及 <select> 元素. ...
- Java虚拟机中Java内存区域
Java虚拟机所管理的内存将会包括以下几个运行时数据区域. 程序计数器 可以看作是当前线程所执行的字节码的行号指示器. 每一个线程都需要有一个独立的程序计数器. 如果线程正在执行的是一个Java方 ...
- AngularJS2环境配置
所使用到的文件目录结构如下所示: 1. 创建配置文件: 1.1. 创建目录: mkdir angular-quickstart cd angular-quickstart 1.2. 载入 ...