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 ...
随机推荐
- 华为eNSP无限井号#解决方法
如下图所示,允许ensp相关应用通过防火墙
- wireshark-1
wireshark-1题目来源: 广西首届网络安全选拔赛题目描述:黑客通过wireshark抓到管理员登陆网站的一段流量包(管理员的密码即是答案). flag提交形式为flag{XXXX}附件解压后, ...
- Wireshark教程之数据包操作
实验目的 1.工具介绍 2.主要应用 实验原理 1.网络管理员用来解决网络问题 2.网络安全工程师用来检测安全隐患 3.开发人员用来测试执行情况 4.学习网络协议 实验内容 1.工具基本使用 2.快速 ...
- 【基础知识】CPU原理之减法、乘法和除法
中介绍了布尔逻辑.数学和电路的关系,我们也得到了与门.或门.非门.或非门.与非门.异或门等门电路以及一个加法器,并且了解了计算机是如何做加法的,这篇文章介绍一下计算机是如何做减法以及乘除法的. 0x0 ...
- C#基于Redis实现分布式锁
[本博客属于原创,如需转载,请注明出处:https://www.cnblogs.com/gdouzz/p/12097968.html] 最近研究库存的相关,在高峰期经常出现超卖等等情况,最后根据采用是 ...
- Qt:QCustomPlot使用教程(三)——用户交互
0.说明 本节翻译总结自:Qt Plotting Widget QCustomPlot - User Interactions 本节内容是使用QCustomPlot实现绘图和用户交互功能. 本文代码中 ...
- JZ-051-构建乘积数组
构建乘积数组 题目描述 给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]A[1]...A[i-1]A[i+1]...A[n-1]. ...
- LeetCode-290-单词规律
单词规律 题目描述:给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非 ...
- linux文本处理grep
grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...
- matlab图形中添加文本框
图形中添加文本框,自己目前了解到了两种方法:1.用legend函数就可以对图形标注,形成一个文本框: 2.就是用annotation('textbox',[0.2,0.2.0.1,0.3],'Line ...