题意:

判断两点之间是否可以通过至多有两次转变方向以达到相连,就是平时玩的连连看游戏,但是不能从外面绕过去。

思路: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)的更多相关文章

  1. hdu 1175(BFS&DFS) 连连看

    题目在这里:http://acm.hdu.edu.cn/showproblem.php?pid=1175 大家都很熟悉的连连看,原理基本就是这个,典型的搜索.这里用的是广搜.深搜的在下面 与普通的搜索 ...

  2. HDU - 1175 bfs

    思路:d[x][y][z]表示以z方向走到(x, y)的转弯次数. 如果用优先队列会超时,因为加入队列的节点太多,无用的节点不能及时出队,会造成MLE,用单调队列即可. AC代码 #include & ...

  3. hdu 1175 bfs+priority_queue

    连连看 如上图所示如果采用传统bfs的话,如果按照逆时针方向从(1,1)-->(3,4)搜索,会优先选择走拐四次弯的路径导致ans错误: Time Limit: 20000/10000 MS ( ...

  4. hdoj 1175 连连看

    连连看 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. BFS(八数码) POJ 1077 || HDOJ 1043 Eight

    题目传送门1 2 题意:从无序到有序移动的方案,即最后成1 2 3 4 5 6 7 8 0 分析:八数码经典问题.POJ是一次,HDOJ是多次.因为康托展开还不会,也写不了什么,HDOJ需要从最后的状 ...

  6. HDU(1175),连连看,BFS

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...

  7. BFS+贪心 HDOJ 5335 Walk Out

    题目传送门 /* 题意:求从(1, 1)走到(n, m)的二进制路径值最小 BFS+贪心:按照标程的作法,首先BFS搜索所有相邻0的位置,直到1出现.接下去从最靠近终点的1开始, 每一次走一步,不走回 ...

  8. DFS/BFS+思维 HDOJ 5325 Crazy Bobo

    题目传送门 /* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有 ...

  9. hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...

随机推荐

  1. 手机APP测试思路及测试要点

    一  手机APP测试基本思路: 测试计划--测试方案--测试用例--执行: 很多小公司都没有具体的需求,项目时间也比较紧,而且流程也不是很严谨,在这样的情况之下,作为测试的我们,该怎样去对项目进行用例 ...

  2. HDU2063(二分图最大匹配)

    过山车 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  3. 远程控制TOMCAT启动

    远程控制TOMCAT启动 1.在tomcat/conf/tomcat-users.xml中配置好管理员帐号和密码.    2.在浏览器中输入:http://你的ip/manager/list.     ...

  4. DTLS-PSK算法抓包解析

    一.DTLS -PSK PSK 是DTLS 定义的密钥交换方案之一,相对于公钥证书方案(如 ECDHA_RSA) 来说,其具备更加轻量化.高效的优点: 而目前 PSK方案应用也比较广泛. 关于DTLS ...

  5. java多线程安全问题 静态函数的修饰

    /* 如果同步函数被静态修饰后,使用的锁是什么呢? 通过验证,发现不在是this.因为静态方法中也不可以定义this. 静态进内存是,内存中没有本类对象,但是一定有该类对应的字节码文件对象. 类名.c ...

  6. matlab 逻辑数组及其应用

    这几天学习了matlab的逻辑数组功能,总的感觉就有两点: 第一,通过对原来的数组a进行逻辑判断后得到逻辑数组b 第二,逻辑数组进行某种运算符操作又回到原数组类型 第三,利用逻辑数组mask功能 测试 ...

  7. 最简单的排序算法之一冒泡排序----js实现

    1. 算法步骤 比较相邻的元素.如果第一个比第二个大,就交换他们两个. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.这步做完后,最后的元素会是最大的数. 针对所有的元素重复以上的步骤, ...

  8. 第一章 Java语言概述

    1.人机交互有两种方法:一种是图形化界面,一种是命令行方式 2.如何打开命令行:开始-在运行命令行中输入cmd 3.常用的DOS命令: dir(directory):列出当前目录下文件及文件夹 md( ...

  9. HTML中的a标签实现点击下载

    通常在咱们写项目的时候会遇到上传下载什么的,在上传完文件后会把文件的路径保存到数据库里以便下载,如果想不通过后台直接下载的话,可以把文件路径给a标签的属性href: <a href=" ...

  10. 怎么监控apache运行状态和页面统计

    通过使用mod_status的模块来监控Apache web server的负载. 1. mod_status是什么? mod_status是一个apache模块,它帮助监控web server负载和 ...