连连看游戏(dfs)【华为上机题目】
1 连连看游戏
今天同学给我做了道编程题目,貌似是华为的,题目描述大概是这样的:
给定一个连连看棋盘,棋盘上每个点都有各种图案(用非0数字表示),输入棋盘上的任意两个左标,判断这两个坐标对应的图案是否可以消除,消除的条件是图案相同且图案间连线的转角数不得超过2。例如有下面一个棋盘:
1 3 3 4
0 6 0 0
4 0 2 1
6 0 4 2
在棋盘中,(0,1)和(0,2)中的图案没有转角可以消除,(1,1)和(3,0)中的6有一个转角可以可以消除,(2,0)和(3,2)中的4有两个转角可以消除,而(0,0)和(2,3)中的1不能消去。
输入数据为连续的整数,第一个数为棋盘的行数m,第二个数为棋盘的列数n,然后依次是m*n个棋盘数据,最后是两个坐标对应的行号和列号。
如果图案不能消除,输出0, 如果图案可以消除,输出图案消除路线上图案的个数(包含输入的两个图案,不考虑有多条可消除路径的情况)。
例如输入4,4,1,3,3,4,0,6,0,0,4,0,2,1,6,0,4,2,2,0,3,2(棋盘的数据就是上面例子中的数据)
输出为4,输入是一个4*4的棋盘,最后两个图案的坐标为(2,0)和(3,2),中间为棋盘中的数据。
看这题目本来是不难的,不过题目的输出看了半天没理解,“输出图案消除路线上图案的个数”是路线上连接的图案吗?两个图案直接的路线连接不是不能有图案吗?纠结了半天还是不懂什么意思。最后只能理解是两个图案所连接的线路中坐标点的个数了(不知道理解的对不对),如果这样理解的话题目就不是很难了,就是对于两个给定的坐标点能否联通,并且连接连个坐标点的路径上不能超过两个拐角就行了,用一般的dfs就可以解决。不过这道题目中路径上的拐角可以帮助用来减少搜索的深度,即当前搜索的路径已经超过了两个拐角之后直接忽略该条路径的搜索。本来搜索时为了防止搜索已经搜索的坐标,坐标位置是要做标记的,不过因为路线最多出现两个拐角,所以不可能出现这种情况,要出现这种情况必须至少要三个拐角。还有就是为了尽量减少搜索路径出现的拐角数量,搜索的方向尽量保持不要改变,即如果能不改变方向,则优先搜索这个方向,之所以可以这样做是因为题目只要求找出一条满足条件的路径就可以了。具体见下面的代码:
#include <iostream>
#include <stdio.h> int **data;
int m, n, ans;
int start_x, start_y, end_x, end_y;
int move[][] = {{, }, {, }, {, -}, {-, }}; int dfs(int x, int y, int count, int gj, int dir)
{
if (gj > )
return ;
if (x == end_x && y == end_y)
{
ans = count;
return ;
}
int x1, y1;
if (count > ) //优先考虑上一步和当前步的方向保持一致
{
x1 = x + move[dir][];
y1 = y + move[dir][];
if (x1 >= && x1 < m && y1 >= && y1 < n && !data[x1][y1])
{
if (dfs(x1, y1, count + , gj, dir))
return ;
}
}
for (int i = ; i < ; i++)
{
if (count > && i == dir)
continue;
x1 = x + move[i][];
y1 = y + move[i][];
if (x1 >= && x1 < m && y1 >= && y1 < n &&
!data[x1][y1] && (count == || ((i + ) % ) != dir)) //无须考虑当前步方向与前一步方向相反
{
if (dfs(x1, y1, count + , (i == dir || count == ) ? gj : gj + , i))
return ;
} }
return ;
}
int main(void)
{
freopen("in.txt", "r", stdin); char temp;
int i, j; std::cin >> m >> temp >> n >> temp;
data = new int *[m];
for (i = ; i < m; i++)
data[i] = new int[n]; for (i = ; i < m; i++)
for (j = ; j < n; j++)
std::cin >> data[i][j] >> temp;
std::cin >> start_x >> temp >> start_y >> temp >> end_x >> temp >> end_y;
ans = ;
data[end_x][end_y] = ;
dfs(start_x, start_y, , , );
std::cout << ans << std::endl;
return ;
}
连连看游戏(dfs)【华为上机题目】的更多相关文章
- 华为上机题汇总----java
以下华为上机题目都是网上整理得到的,代码都是自己调试过的,由于网上java答案较少,欢迎大家批评指正,也希望对准备华为上机的童鞋们有一点点帮助.在练习的过程中成长,加油!~~ 第1题:输入字 ...
- C/C++编程笔记:C语言实现连连看游戏,小白练手项目(源码分享)
本篇文章分享看题目就知道是写给初学者的,学的比较好的小伙伴也可以将自动算法等一些知识给加进去,希望对大家有帮助! 好了,当我们所有的准备工作做好之后,我们就可以来编写我们的C语言连连看游戏了! 其实这 ...
- 哆啦A梦连连看游戏源码完整版
这个源码是哆啦A梦连连看游戏源码完整版,也是安卓教程网android.662p.com分享过来的,哆啦A梦大家一定再熟悉不过了,这次登场的角色你能认出全部吗?赶紧把相同的小图标全部消除吧,一起体验下! ...
- OJ——华为编程题目:输入字符串括号是否匹配
package t0815; /* * 华为编程题目:输入字符串括号是否匹配 * 若都匹配输出为0,否则为1 * 样例输入:Terminal user [name | number (1)] * 样例 ...
- [置顶] ios 水果连连看游戏源码
原创文章,转载请注明出处:http://blog.csdn.net/donny_zhang/article/details/9251917 demo功能:水果连连看游戏源码.iphone6.1 测试通 ...
- Android版本铎A梦幻连连看游戏源代码完整版
我写主代码,没有版权问题,它少量小游戏和应用源代码稍后会陆续上线!哆啦A梦连连看包含了2种游戏模式和60关卡,并能够通过改动配置文件非常方便的实现自行添加新关卡.採用andengine游戏引擎开发,内 ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之实现游戏逻辑(五)
在上一篇<我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)>中提到的两个类: GameConf:负责管理游戏的 ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之加载界面图片和实现游戏Activity(四)
正如在<我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)>一文中看到的,在AbstractBoard的代码中,当程序需要创建N个Piec ...
- 我的Android进阶之旅------>Android疯狂连连看游戏的实现之状态数据模型(三)
对于游戏玩家而言,游戏界面上看到的"元素"千变万化:但是对于游戏开发者而言,游戏界面上的元素在底层都是一些数据,不同数据所绘制的图片有所差异而已.因此建立游戏的状态数据模型是实现游 ...
随机推荐
- DIV+CSS自适应布局
自适应布局分两类:高度和宽度,方法有很多,我用三列布局举例,我就列几个通俗易懂的例子呗,懂了三列的,两列的原理一样,呵呵哒. 效果图如下:高度自适应——宽度自适应 1,高度自适应 ...
- PMP备考_第六章_项目时间管理
项目时间管理 前言 项目时间管理是项目管理中最难的一个环节,与个人时间管理类似,团体的效率如果管理不当,是低于个人效率的,为了管理好时间,从预估,执行到反馈均需要严格的分析和处理.如果制定的计划是无法 ...
- MyBatis的经典案例
1.首先我们先了解Mybatis的一些jar包 ---和项目框架 2.接下来就看看mybatis的配置文件(mybatis-config.xml) <?xml version="1.0 ...
- 第三方框架之ThinkAndroid 学习总结(二)
上文记录了一些ThinkAndroid常用的模块,本文继续介绍ThinkAndroid中的网络化模块. 按照惯例先上Github原文地址:https://github.com/white-cat/Th ...
- bzoj 2739 最远点
Description 给你一个N个点的凸多边形,求离每一个点最远的点. Input 本题有多组数据,第一行一个数T,表示数据组数. 每组数据第一行一个数N,表示凸多边形点的个数,接下来N对数,依次表 ...
- Linux堆内存管理深入分析(下)
Linux堆内存管理深入分析 (下半部) 作者@走位,阿里聚安全 0 前言回顾 在上一篇文章中(链接见文章底部),详细介绍了堆内存管理中涉及到的基本概念以及相互关系,同时也着重介绍了堆中chunk分 ...
- ReactNative与NativeScript对比报告
综合这段时间对ReactNative(下称RN)和NativeScript(下称NS)的简单学习了解,分别从不同方面分析对比二者的优缺点. 页面结构 NS一个页面的目录结构: RN的一个页面一般就是一 ...
- 跨域获取json一些理解[腾讯电商数据的拉取方式]
如何跨域获取json数据源?我们都知道要有callback,具体callback是如何工作的呢?如果服务器端不接收callback,我们是不是就没有办法处理了呢?读完本文后相信你会有一个大体的了解. ...
- vmware 虚拟机通信拿不到 inet addr 的解决办法
我在虚拟机上安装完红帽之后,使用ifconfig命令来看网卡的IP,但是,输入命令之后,eht0里面只有 inet6 addr 而没有 inet addr,不多说,上图. 解决办法如下:打开 虚拟机设 ...
- iOS--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook等系统服务开发汇总
iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如QQ通讯录.微信电话本会使用iOS的通讯录,一些第三方软件会在应用内发送短信等.今天将和大家一起学习如何使用系统应用.使用系统服务: ...