题目:

“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
Input
输入数据有多组。每组数据的第一行有两个正整数n,m(0< n<=1000,0< m<1000),分别表示棋盘的行数与列数。在接下来的n行中,每行有m个非负整数描述棋盘的方格分布。0表示这个位置没有棋子,正整数表示棋子的类型。接下来的一行是一个正整数q(0 < q<50),表示下面有q次询问。在接下来的q行里,每行有四个正整数x1,y1,x2,y2,表示询问第x1行y1列的棋子与第x2行y2列的棋子能不能消去。n=0,m=0时,输入结束。
注意:询问之间无先后关系,都是针对当前状态的!
Output
每一组输入数据对应一行输出。如果能消去则输出”YES”,不能则输出”NO”。
Sample Input
3 4
1 2 3 4
0 0 0 0
4 3 2 1
4
1 1 3 4
1 1 2 4
1 1 3 3
2 1 2 4
3 4
0 1 4 3
0 2 4 1
0 0 0 0
2
1 1 2 4
1 3 2 3
0 0
Sample Output
YES
NO
NO
NO
NO
YES

分析与解答:

这个题需要考虑转向,转向的话就是根据到当前数走的方向与到上个数走的方向是否相同来判断。如果不同,转弯的数要加一。现在我们有坐标,方向转弯次数就好写了,其中我们认为方向0就是向下,1向右,2向上,3向左,-1是最初的x1y1的方向,意味着从他走向下一个数是不用考虑转弯的,只用记录到达这个数的方向
由于他是询问x1y1到x2y2,我们只需判断是否有x1y1到x2y2的路,这个题让我刷新了对标记数组的认识,之前的标记数组都是经过了就变为另一个数,下次在经过这个坐标时如果已做过标记就不走。但这个是用于记录从(x1,y1)到(i,j)转弯的最小次数,如果在(i,j)这个位置的step<=v[i][j],就push到队列里,我试了一下,如果把这个标志数组去掉就会超时,就是从起点到一个点的的路径有多条,但是如果只是说经过了就不再考虑到这个点的其他路径的话,这个点到终点的转弯次数加上起点到这个点的转弯次数会超过二,这是不满足题意的,所以我们到这个点之后还需要考虑其他到这个点的路径,其唯一目的就是让从起点到终点的路径转弯的次数最小,这样的话,就有极大的可能从这个路径一直走到终点的过程中转弯的次数满足题意,所以我们标记数组只存最小或者等于目前最小的转弯次数的路径
前面还有个判断,如果step比2小,就继续搜索,这是题目要求
还有常规判断,走一步之后新的坐标在范围内,新坐标这个位置没有棋子,这个新坐标就是我们要找的坐标 ,满足这写条件,此时我们再考虑是不是该push了

参考代码:
https://blog.csdn.net/jzmzy/article/details/16862263

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define MAXN 1005
using namespace std;
int map[MAXN][MAXN],v[MAXN][MAXN];
const int dx[4] = {0,1,0,-1};
const int dy[4] = {-1,0,1,0};
int n,m,flag;
struct node
{int x,y;int dir;//记录方向int step;//记录转弯次数
};
int bfs(int x1,int y1,int x2,int y2)
{memset(v,11,sizeof(v));//标志数组 记录某条路径在该点转向的次数queue <node> q;node s,temp;s.x = x1;s.y = y1;s.dir = -1;//-1表示朝哪个方向都可以s.step = 0;q.push(s);while(!q.empty()){temp = q.front();q.pop();if(temp.x == x2 && temp.y == y2 && temp.step <= 2)return 1;for(int i = 0; i < 4; i ++){s = temp;s.x += dx[i];s.y += dy[i];//走一步之后新的坐标在范围内,而且只有当坐标这个位置没有棋子或者说这个坐标就是我们要找的坐标 if(s.x >= 1 && s.x <= n && s.y >= 1 && s.y <= m && (map[s.x][s.y] == 0 || (s.x == x2 && s.y == y2))){if(s.dir != -1)//s.dir是上上个坐标走到上个坐标的方向,这个坐标要从新记录 {if(s.dir != i)//与上个坐标的方向相反,就说明转弯了 {s.dir = i;s.step ++;}}else s.dir = i;//记录走的方向 if(s.step > 2) continue;if(s.step <= v[s.x][s.y])//保证转弯次数最少,等号不能忘记{v[s.x][s.y] = s.step;q.push(s);}}}}return 0;
}
int main()
{int i,j,t,x1,y1,x2,y2;while(scanf("%d%d",&n,&m),(n+m)){for(i = 1; i <= n; i ++)for(j = 1; j <= m; j ++)scanf("%d",&map[i][j]);//n行m列的图 scanf("%d",&t);while(t--)//从、询问 {scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//坐标相同,或者数不同,或者没有东西 if(!map[x1][y1] || !map[x2][y2] || map[x1][y1] != map[x2][y2] || (x1 == x2 && y1 == y2) )flag = 0;else flag = bfs(x1,y1,x2,y2);if(flag) puts("YES");else puts("NO");}}return 0;
}

(bfs)连连看(hdu1175)相关推荐

  1. POJ2308连连看dfs+bfs+优化

    DFS+BFS+MAP+剪枝 题意:       就是给你一个10*10的连连看状态,然后问你最后能不能全部消没? 思路:      首先要明确这是一个搜索题目,还有就是关键的一点就是连连看这个游戏是 ...

  2. HDU 1175 连连看(BFS)

    Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线 ...

  3. 连连看(HDU-1175)

    Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线 ...

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

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

  5. HDU1175 连连看【DFS】

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

  6. HDU 1175 连连看【BFS】

    连连看 Time Limit : 20000/10000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submiss ...

  7. HDU1175 连连看

    Problem Description "连连看"相信很多人都玩过.没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子.如果某两个相同的棋子,可以通过一条线 ...

  8. Codeforces 793b B. Igor and his way to work 觉得大神写的3维bfs太复杂,突然发现这题是连连看算法。

    看大神写的dp[x][y][c]表示的(x,y)位置c方向的三维DFS, 这题说是转不超过两个弯,其实就是连连看. 扫描S和T左右上下达到的最大点. 左右上下都取S和T达到的最小范围. 1.用左右范围 ...

  9. HDU1175 连连看【DFS+剪枝】

    连连看 题意: 给定一个n*m的连连看的图,有q次操作,问点击(sx,sy)与(ex,ey)能否使方格消失(!!但是,就算可以消失,也不能改变原图,这q次操作相互之间没有联系).消失的条件详见题目. ...

最新文章

  1. 页面滑动至某处,固定导航。
  2. bzoj 4602: [Sdoi2016]齿轮
  3. python读取大文件的坑_python读取大文件踩过的坑——读取txt文件词向量
  4. SAP Cloud for Customer用ABSL消费Restful Mashup API
  5. Entity Framework在三层架构中的使用
  6. 备忘--简单比较SPSS、RapidMiner、KNIME以及Kettle四款数据分析工具
  7. 如何将开源项目部分代码作为private放在github上?
  8. 字符串拼接的sql注入实战
  9. 扩展欧几里得算法的实现
  10. 用印审批移动办公用户手册
  11. matlab 判断 正态分布,Matlab实现正态分布
  12. zookeeper 集群 + kafka 集群 : 安装部署(附单机部署)
  13. 记一次 ERROR scheduler.AsyncEventQueue: Dropping event from queue shared导致OOM
  14. Shellshock漏洞复现
  15. 破解神器Hashcat使用简介
  16. postman接口测试响应体出错显示HTML网页的问题
  17. 谷歌学术得到论文被引用信息
  18. solr中英文分词模糊查询
  19. Google Android开发入门与实战 视频教程 源代码 游戏应用开发 传送门
  20. WIN32虚拟STM32F7 LCD屏幕(WIN32虚拟单片机)

热门文章

  1. Python PyCharm利用PyQt5使QPlainTextEdit支持拖放文件,类提升,重写QPlainTextEdit类
  2. c++ for each 遍历tuple
  3. centos利用nexus搭建局域网docker私有仓库
  4. enum mysql byte_九、臭名昭著的 MySQL ENUM 类型 ( 上 )
  5. java实现复制粘贴的计算器_软帝学院教你用java编写计算器(三)
  6. java接口如何接受语音参数_Java 是如何优雅地实现接口数据校验的?
  7. Win11如何跳过开机更新 Win11跳过开机更新教程
  8. 如何根据进程号去查端口号?
  9. 鸿蒙构架谁提供的,科普丨关于“鸿蒙”,不知道这些你都不好意思跟别人打招呼!...
  10. arr数组怎么取值_记一次思否问答的问题思考:Vue为什么不能检测数组变动