转载至: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"。

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
题目要求比较简单就是用代码处理连连看,只是不能绕外圈
  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_字节跳动笔试原题的更多相关文章

  1. HDU 1175 连连看(超级经典的bfs之一)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1175 连连看 Time Limit: 20000/10000 MS (Java/Others)     ...

  2. 合并K个有序数组(链表)【字节跳动面试算法题】

    本题是本人字节跳动一面考的算法题原题是有序数组,一时没想到怎么解决数组的问题,但是如果给的是有序链表数组,则可以用下面的方法解决 可以利用最小堆完成,时间复杂度是O(nklogk),具体过程如下: 创 ...

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

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

  4. hdu 1175 连连看 DFS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 解题思路:从出发点开始DFS.出发点与终点中间只能通过0相连,或者直接相连,判断能否找出这样的路 ...

  5. Hdu 1175 连连看(DFS)

    Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1175 因为题目只问能不能搜到,没问最少要几个弯才能搜到,所以我采取了DFS. 因为与Hdu ...

  6. hdu 1175 连连看 (深搜)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 题目大意:如果某两个相同的棋子,可以通过一条线连起来(这条线不能经过其它棋子)这样的两个棋子可以 ...

  7. HDU - 1175 连连看 【DFS】【BFS】

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1175 思路 这种题一想到就用搜索, 但是内存是32m 用 bfs 会不会MLE 没错 第一次 BFS的 ...

  8. HDU 1175 连连看

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

  9. HDU 1175 连连看(BFS)

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

随机推荐

  1. 华为eNSP无限井号#解决方法

    如下图所示,允许ensp相关应用通过防火墙

  2. wireshark-1

    wireshark-1题目来源: 广西首届网络安全选拔赛题目描述:黑客通过wireshark抓到管理员登陆网站的一段流量包(管理员的密码即是答案). flag提交形式为flag{XXXX}附件解压后, ...

  3. Wireshark教程之数据包操作

    实验目的 1.工具介绍 2.主要应用 实验原理 1.网络管理员用来解决网络问题 2.网络安全工程师用来检测安全隐患 3.开发人员用来测试执行情况 4.学习网络协议 实验内容 1.工具基本使用 2.快速 ...

  4. 【基础知识】CPU原理之减法、乘法和除法

    中介绍了布尔逻辑.数学和电路的关系,我们也得到了与门.或门.非门.或非门.与非门.异或门等门电路以及一个加法器,并且了解了计算机是如何做加法的,这篇文章介绍一下计算机是如何做减法以及乘除法的. 0x0 ...

  5. C#基于Redis实现分布式锁

    [本博客属于原创,如需转载,请注明出处:https://www.cnblogs.com/gdouzz/p/12097968.html] 最近研究库存的相关,在高峰期经常出现超卖等等情况,最后根据采用是 ...

  6. Qt:QCustomPlot使用教程(三)——用户交互

    0.说明 本节翻译总结自:Qt Plotting Widget QCustomPlot - User Interactions 本节内容是使用QCustomPlot实现绘图和用户交互功能. 本文代码中 ...

  7. 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]. ...

  8. LeetCode-290-单词规律

    单词规律 题目描述:给定一种规律 pattern 和一个字符串 str ,判断 str 是否遵循相同的规律. 这里的 遵循 指完全匹配,例如, pattern 里的每个字母和字符串 str 中的每个非 ...

  9. linux文本处理grep

    grep grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具 ...

  10. matlab图形中添加文本框

    图形中添加文本框,自己目前了解到了两种方法:1.用legend函数就可以对图形标注,形成一个文本框: 2.就是用annotation('textbox',[0.2,0.2.0.1,0.3],'Line ...