hdu 1175 连连看 DFS_字节跳动笔试原题
转载至:https://www.cnblogs.com/LQBZ/p/4253962.html
Problem Description
“连连看”相信很多人都玩过。没玩过也没关系,下面我给大家介绍一下游戏规则:在一个棋盘中,放了很多的棋子。如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子),而且线的转折次数不超过两次,那么这两个棋子就可以在棋盘上消去。不好意思,由于我以前没有玩过连连看,咨询了同学的意见,连线不能从外面绕过去的,但事实上这是错的。现在已经酿成大祸,就只能将错就错了,连线不能从外围绕过。
玩家鼠标先后点击两块棋子,试图将他们消去,然后游戏的后台判断这两个方格能不能消去。现在你的任务就是写这个后台程序。
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"。
1 #include<iostream>
2 #include<cstring>
3 #define M 1010
4 using namespace std;
5 int dix[4]={0,1,0,-1};
6 int diy[4]={1,0,-1,0};//方向
7 int map[M][M];//建立地图
8 bool vid[M][M];//标记是否走过
9 bool flag;
10 int n,m,q,i,j,x1,x2,y1,y2;
11 int main()
12 {
13 void dfs(int x,int y,int turn,int direction);
14 while(cin>>n>>m,n||m)
15 {
16 memset(vid,0,sizeof(vid));
17 for(i=1;i<=n;i++)
18 for(j=1;j<=m;j++)
19 cin>>map[i][j];
20 cin>>q;
21 while(q--){
22 cin>>x1>>y1>>x2>>y2;
23 if(x1==x2&&y1==y2){
24 cout<<"NO"<<endl;
25 continue;
26 }//当起点终点相同的时候是不能消除的
27 if(x1<1||x1>n||y1<1||y1>m||x2<1||x2>n||y2<1||y2>m)
28 {
29 cout<<"NO"<<endl;
30 continue;
31 }//经过本人测试,本题例子有在地图之外的存在
32 if(map[x1][y1]==map[x2][y2]&&map[x1][y1])//当始末位置的数字相同并且不等于0才能运行
33 {
34 flag=0;
35 for(i=0;i<4;i++)//这里比较重要你要从一个点的4个方向进行处理
36 dfs(x1,y1,0,i);
37 if(!flag)
38 cout<<"NO"<<endl;
39 }
40 else
41 cout<<"NO"<<endl;
42 }
43 }
44 return 0;
45 }
46 void dfs(int x,int y,int turn,int direction)
47 {
48 if(flag)
49 return;
50 if(x>n||x<1||y<1||y>m||vid[x][y])//当出界或是走过的地方返回
51 return;
52 if(turn==2&&x!=x2&&y!=y2)//从别人那里抄袭的比较好的剪枝
53 return;
54 /***********************************************
55 我来解释下这个剪枝,当转了两次方向之后就不能转方向了。
56 所以当转了2次的时候进行特判,如果当前位置和终点不在一条
57 直线的时候就返回,因为不在一条位置上的时候你不转向就不
58 可能到终点,这道题这个特判的剪枝是比较好的,有的人的剪
59 枝方法就也和这个差不多不过因为他进行了方向的判断所以代
60 码就有点长也拖了一点时间的后腿。
61 ***********************************************/
62 if(turn>2)
63 return;
64 if(x==x2&&y==y2&&turn<=2){
65 cout<<"YES"<<endl;
66 flag=1;
67 return;
68 }//判断是否到了终点
69 if(map[x][y]!=0)//在这里被坑了11次5555
70 {
71 if(x==x1&&y==y1);
72 else return;
73 }///当目前位置不为0,并且不为起点的时候要返回
74 vid[x][y]=1;
75 int dx,dy,i;
76 for(i=0;i<4;i++)
77 {
78 dx=x+dix[i];
79 dy=y+diy[i];
80 if(i==direction)///当方向相同的时候转向就不变
81 dfs(dx,dy,turn,direction);
82 else///不相同的时候转向要加一
83 dfs(dx,dy,turn+1,i);
84 }
85 vid[x][y]=0;///记得清除标记
86 return;
87 }
88 /*
89 提供一点测试的数据
90 5 5
91 1 0 2 2 2
92 2 0 1 1 1
93 1 1 1 1 1
94 1 1 1 1 1
95 1 1 1 1 1
96 5
97 1 1 3 1
98 1 1 3 2
99 1 1 2 3
100 1 1 2 4
101 1 1 5 5
102 8 8
103 1 2 7 0 0 3 5 6
104 0 0 4 0 5 6 0 0
105 0 0 5 0 4 8 7 0
106 0 0 0 0 0 0 0 0
107 2 0 8 0 0 0 0 7
108 6 5 3 0 2 4 0 9
109 7 0 0 0 0 0 0 7
110 9 7 9 8 6 6 1 5
111 5 5
112 1 1 8 7
113 1 2 5 1
114 3 6 5 3
115 3 6 8 4
116 5 8 7 8
117 */
hdu 1175 连连看 DFS_字节跳动笔试原题的更多相关文章
- HDU 1175 连连看(超级经典的bfs之一)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others) ...
- 合并K个有序数组(链表)【字节跳动面试算法题】
本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...
- hdu - 1728逃离迷宫 && hdu - 1175 连连看 (普通bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1728 这两道题花了一下午的时候调试,因为以前做过类似的题,但是判断方向的方法是错的,一直没发现啊,真无语. 每个 ...
- hdu 1175 连连看 DFS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...
- Hdu 1175 连连看(DFS)
Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...
- hdu 1175 连连看 (深搜)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以 ...
- HDU - 1175 连连看 【DFS】【BFS】
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路 这种题一想到就用搜索, 但是内存是32m 用 bfs 会不会MLE 没错 第一次 BFS的 ...
- HDU 1175 连连看
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
- HDU 1175 连连看(BFS)
连连看 Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submi ...
随机推荐
- CobaltStrike逆向学习系列(3):Beacon C2Profile 解析
这是[信安成长计划]的第 3 篇文章 关注微信公众号[信安成长计划] 0x00 目录 0x01 Controller 端分析 0x02 Beacon 端分析 0x03 展示图 在上一篇文章中完成了 S ...
- 100G/40G/25G/10G网络测试解决方案
一.100G概述 随着CDN等视频直播业务和P2P业务的快速发展,带宽的要求越来越高.当前5G业务势头正盛,其基于400G的主干网络通信业务也在积极部署之中.但当前在很多的业务场景中,100G系统的部 ...
- 创新引领,再获嘉誉!Smartbi亮相亚太银行数博会,共话未来银行数字化趋势
4月21日,以"加速数字化,引领银行业务创新"为主题的第六届亚太银行数字化创新博览会在上海盛大开幕.本次高峰论坛吸引了400多位来自学术界.咨询行业以及银行业等不同领域的行业大咖齐 ...
- 你的程序员女孩「GitHub 热点速览 v.22.09」
本周最火的项目要数上周推荐的开源项目 How to Cook,火到一周涨了 18k+ star,但网友对它的定量烹饪方法褒贬不一.在本人看来,烹饪本就是一门"玄学",萝卜青菜各有所 ...
- 【C# 调试】.net中的 .pdb文件是什么,有什么用
mscn:在 Visual Studio 调试器(C#)中指定符号 (.pdb) 和源文件 PDB全称Program Database,程序数据库 ( .pdb) 文件(也称为符号文件)将项目源代码中 ...
- idea maven问题汇总
目录 idea问题.maven问题汇总 解决方法汇总 idea问题.maven问题汇总 idea maven依赖包报can't resolve问题 代码飘红 解决办法:删除所有.idea等idea相关 ...
- Anaconda 下 Jupyter 更改默认启动路径方法(转)
https://www.cnblogs.com/awakenedy/p/9075712.html
- LeetCode-098-验证二叉搜索树
验证二叉搜索树 题目描述:给定一个二叉树,判断其是否是一个有效的二叉搜索树. 假设一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和 ...
- SQL实现一年中每个日期剔除节假日和星期天之后的五个日期是多少
最近公司OA系统的需求,实现一年中每个日期剔除节假日和星期天之后的五个日期是几号,每个日期都要跳过节假日和星期天,当时是真的慌了,郁闷了一天,后来半夜忽然来灵感,想想还是可以实现. 需要做一张节假日的 ...
- 译<容器网络中OVS-DPDK的性能>
译<容器网络中OVS-DPDK的性能> 本文来自对Performance of OVS-DPDK in Container Networks的翻译. 概要--网络功能虚拟化(Network ...