9517 Link Link Look
9517 Link Link Look
该题有题解
时间限制:2000MS 内存限制:65535K
提交次数:67 通过次数:18
题型: 编程题 语言: G++;GCC
Description
相信大家都玩过连连看.连看看是在一个方格上面有各种不同的图案,没图案的格子视为通道.如果能找到两个图案,他们之间能通过通道而转弯次数不超过2的道路连接起来,那么这两个图案视为可消图案
例如
10024
02057
33001
这样两个1,2,3都可消
但
10030
04070
06000
54321
这样的两个1是不可消的,但如果把3消去,两个1就可以消去了..
由于规则太复杂了,导致玩的时候我有点混乱,所以想请你帮我.现在我在一个局面卡住了,进行不下去.所以想请你帮我看看现在还有多少对可以消去的图案(注意不一定所有的图案都配对的)
例如
10024
02057
33001
就有3对
输入格式
第一行是两个数n,m表示方格大小为n*m (50>n,m>0)
接下来是n行,每一行有m个数,0表示空,其余数字表示对应的图案,图案数字类型不超过20
输出格式
输出一个数字表示当前局面可消对数(我可以有多少种选择)
看样例2
输入样例
Sample Input #1:
3 5
1 0 0 2 4
0 2 0 5 7
3 3 0 0 1
Sample Input #2:
1 4
1 1 1 1
输出样例
Sample Output #1:
3
Sample Output #2:
3
提示
方格四周是没东西的,连线不能超过方格,一超过就不知道去到什么异空间了(@_@)
注意Sample Input/Output用#1和#2。。。,并不是输入的部分,而是表示这是两组不同的数据。
即,你所需做的是读入一组数据,输出答案,然后就可以结束程序了。
来源
ick2
作者
a470086609
这题的解题思路就是用深度优先搜索。用个for将每个不为0的点都进行dfs,并且将每个dfs过的点用数组flag存储起来,防止遍历后面的点进行dfs时重复计数了这个地方。而在对一个起始点进行dfs前还要用到一个book数组,用来将dfs时能够与起始点进行消对的点i用book[i]标记好,防止起始点向别的方向搜索时如果回到这个点上而又重复计数。再具体的解释在代码注释中。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,sum=0;
int map[55][55],flag[55][55],book[55][55],next[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; //next表示移动的四个方向
//flag用来标记已经消过的点,避免重复计数。book用来当前搜索中已走过的路,避免重走
//
void dfs(int x,int y,int change,int dect,int ans)//change表示已转弯次数,dect为上一次移动时的方向
{
int tx,ty;
for(int i=0; i<4; i++) //枚举四个移动方向
{
tx=x+next[i][0];
ty=y+next[i][1];
if(tx>=n||tx<0||ty>=m||ty<0)
continue;
if(!map[tx][ty])//如果是通路
{
if(change<2)
{
if(dect!=i)
dfs(tx,ty,change+1,i,ans);
else dfs(tx,ty,change,i,ans);
}
else if(change==2)
{
if(dect!=i)
continue;
else dfs(tx,ty,change,i,ans);
}
}
if(map[tx][ty]==ans)//如果找到了相同数字
{
if(!flag[tx][ty])//如果是未曾标记过的
{
if(!book[tx][ty])//如果是未曾消过的
{
if(change==2&&i!=dect)
continue;
else
{
book[tx][ty]=1;
sum++;
}
}
}
}
} }
int main()
{
int i,j;
memset(map,0,sizeof(map));
memset(book,0,sizeof(book));
memset(flag,0,sizeof(flag));
scanf("%d%d",&n,&m);
for(i=0; i<n; i++)
for(j=0; j<m; j++)
scanf("%d",&map[i][j]);
//
for(i=0; i<n; i++)
{
for(j=0; j<m; j++)
{
if(map[i][j]!=0)
{
flag[i][j]=1;
dfs(i,j,-1,-1,map[i][j]);//因为刚开始在起始点时是没有原始方向的(在dfs函数里用i等
//于0 1 2 3来表示四个方向,故这里起始用为-1,在第一次进入dfs时从0开始枚举,同时转弯次数
//也会从-1变为0。
memset(book,0,sizeof(book));//这里记得要重新清0
}
}
}
printf("%d\n",sum);
return 0;
}
9517 Link Link Look的更多相关文章
- linux shell symbolic link & soft link, symbol link, link
linux shell symbolic link symbolic link https://en.wikipedia.org/wiki/Ln_(Unix) https://stackoverflo ...
- ZOJ 2411 Link Link Look(BFS)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1411 题目大意:连连看,给出每次连线的两个坐标,求能消去多少方块,拐 ...
- anagularJs指令的controller,link,compile有什么不同
/directives.js增加exampleDirective phonecatDirectives.directive('exampleDirective', function() { retur ...
- link和@import导入css文件的区别
(二者的区别其实是基础问题,但由于本人经常会忽略掉使用@import导入css文件这种方式,所以记录下来增加印象^^) 首先二者的引入方式: link:<link rel="style ...
- JS魔法堂:LINK元素深入详解
一.前言 我们一般使用方式为 <link type="text/css" rel="stylesheet" href="text.css&quo ...
- angular 自定义指令 link
function link(scope, element, attrs) { ... } where: scope is an Angular scope object. element is the ...
- 引用外部CSS的link和import方式的分析与比较
很多网页中的 CSS 链接与引用是这样写的: <style type="text/css" media="screen"> @import url( ...
- Linux中link,unlink,close,fclose详解
每一个文件,都可以通过一个struct stat的结构体来获得文件信息,其中一个成员st_nlink代表文件的链接数. 当通过shell的touch命令或者在程序中open一个带有O_CR ...
- [AngularJS] Accessing The View-Model Inside The link() When Using controllerAs
If u using controller & controllerAs in directive, then the link()'s 4th param 'controller' will ...
随机推荐
- 洛谷P2756 飞行员配对方案问题(二分图匹配)
P2756 飞行员配对方案问题 题目背景 第二次世界大战时期.. 题目描述 英国皇家空军从沦陷国征募了大量外籍飞行员.由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2 名飞行员,其 ...
- [Apple开发者帐户帮助]三、创建证书(7)创建证书签名请求
Mac上的Keychain Access允许您创建证书签名请求(CSR). 启动位于的Keychain Access /Applications/Utilities. 选择Keychain Acces ...
- WebService常用技术及术语
一.Web Service是什么? 1. 基于Web的服务:服务器端整出一些资源让客户端应用访问(获取数据) 2. 一个跨语言.跨平台的规范(抽象) 3. 多个跨平台.跨语言的应用间通信整合的方案(实 ...
- python 5:str(某一变量)(将其他数字解释为字符串)
age = messege = "Your's age is " + str(age) #将其他数字更改为字符串 print(messege) 运行结果应该是: Your's ag ...
- 1.0 windows10系统安装步骤(1)
1.0 windows10系统安装步骤(1) 根据自己对笔记本系统的折腾,为了方便他人系统的安装,故总结笔记本系统的安装步骤 目录: 1.0 [windows10系统安装步骤(1)] 2.0 Linu ...
- Android 存储路径选择
Android能用来存储的地方有两个,一个是手机内置的存储空间,一个是外置的SD卡,内置的存储空间一般比较小,所以应用的缓存建议存储在外置的SD卡中. 在Android系统中如何获得存储的路径呢? p ...
- IE浏览器发展史
- ES:AI 注释
为AI做注解: AI已经出第三版,大的框架没有改变,DNN也没有引入AI这本书.第四版网络版应流出,不知道最终定版如何! 强化学习的方法有大幅度更新,但从策略系统更新范畴看来,没有什么实质的改变,只是 ...
- js replace替换所有字符
'abc...'.replace(new RegExp('oldStr', 'gm'), 'newStr')
- 阿里P7架构师详解微服务链路追踪原理
背景介绍 在微服务横行的时代,服务化思维逐渐成为了程序员的基本思维模式,但是,由于绝大部分项目只是一味地增加服务,并没有对其妥善管理,当接口出现问题时,很难从错综复杂的服务调用网络中找到问题根源,从而 ...