转载至: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. jmeter获取当前时间、时间运算、时间比较、时间转换

    获取当前时间,转换为指定格式,放入参数 方法一:函数 SSS是毫秒 2020-04-24 13:00:27.446 ${__time(yyyy-MM-dd HH:mm:ss.SSS,)} 方法二:be ...

  2. BI工具入门:如何做关系数据源的连接?

    ​以往咱们分享的操作步骤都稍微有些复杂,大家跟着步骤操作也有些二丈摸不着头脑,看来简单的操作步骤和功能概念还是有必要普及的,那今天就来说一点简单的入门操作知识,以Smartbi为例子,跟大家说说BI工 ...

  3. 【windows 访问控制】二、安全描述符(Security Descriptors,SD)

    安全描述符(Security Descriptors,SD) 定义 安全描述符是与安全对象的安全信息,它含有这个对象所有者的SID,以及一个访问控制列表(ACL,Access Control List ...

  4. python语法:注释

    Python语法:注释  python语言中的注释是来帮助程序员理解并读懂代码内容的文字.当然,注释不仅在python语言中是这个作用,在其他语言中也几乎一样. python注释的生成方式  所有演示 ...

  5. Ubuntu20.04 Linux初识

    转至:https://www.cnblogs.com/luomit/p/13857574.html Ubuntu简述 Ubuntu是常见的三大操作系统Windows.MacOS.Linux中,linu ...

  6. Python:GUI库tkinter(三)

    这一章是对前两章的总结: Python:GUI库tkinter(一) Python:GUI库tkinter(二) 前两章是对控件的介绍,第一章可以知道各控件使用时的具体参数,第二章以具体的例子展示了每 ...

  7. 爬虫之标签查找补充及selenium模块的安装及使用与案例

    今日内容概要 bs模块之标签查找 过滤器 selenium模块 今日内容详细 html_doc = """ <html> <head> <t ...

  8. 安装xpath helper方便进行爬虫

    安装xpath helper方便进行爬虫 因为我使用的是edge浏览器,扩展商店搜索不到xpath-helper,但是我不甘心,取下载源扩展直接放在edge中试试 下载XPath helper的源码 ...

  9. 设置vim永久显示编号

    永久显示行号,需要我们设置配置文件,两种配置方式: 1.  /etc/vimrc   是系统范围的初始化配置 2.  -/.vimrc     个人的vim初始化配置 编辑配置文件,以个人为例: vi ...

  10. LeetCode-078-子集

    子集 题目描述:给你一个整数数组 nums ,数组中的元素 互不相同 .返回该数组所有可能的子集(幂集). 解集 不能 包含重复的子集.你可以按 任意顺序 返回解集. 示例说明请见LeetCode官网 ...