c语言中穷竭算法,hihocoder#1054 : 滑动解锁(深度优先搜索)

描述

滑动解锁是智能手机一项常用的功能。你需要在3×3的点阵上,从任意一个点开始,反复移动到一个尚未经过的”相邻”的点。这些划过的点所组成的有向折线,如果与预设的折线在图案、方向上都一致,那么手机将解锁。两个点相邻当且仅当以这两个点为端点的线段上不存在尚未经过的点。此外,这条折线还需要至少经过4个点。

为了描述方便,我们给这9个点从上到下、从左到右依次编 1-9。那么1->2->3是不合法的,因为长度不足。1->3->2->4也是合不法的,因为1->3穿过了尚未经过的点2。2->4->1->3->6是合法的,因为1->3时点2已经被划过了。

作为一个爱逛知乎的好少年,小Hi已经知道一共有389112种不同的解锁方案。不过小Hi不满足于此,他希望知道,当已经瞥视到一部分折线的情况下,有多少种不同的方案。

遗憾的是,小Hi看到的部分折线既不一定是连续的,也不知道方向。例如看到1-2-3和4-5-6,那么1->2->3->4->5->6,1->2->3->6->5->4, 3->2->1->6->5->4->8->9等都是合法的方案。

输入

第一行包含一个整数T(1

每个测试数据第一行是一个整数N(0

以下N行每行包含两个整数X, Y (1

输出

对于每组数据输出合法的方案数目。

样例输入

3

0

8

1 2

2 3

3 4

4 5

5 6

6 7

7 8

8 9

4

2 4

2 5

8 5

8 6

样例输出

389112

2

258

方法是利用深度优先搜索尝试所有可能,并累计符合的方案数,感觉效率很低啊,难道题目就是这样的意图p>

#include

#include

#include

using namespace std;

int test[][],vis[],depth,aim_depth,n,res,es[][];

int valid(int x,int y)

{

if((test[x][y]||test[y][x])&&!vis[(x+y)/])

{

return ;

}

return ;

}

void dfs(int x,int depth,int e)

{

vis[x]=;

if(depth==aim_depth&&e==n)

{

++res;

return;

}

for(int i=;i

{

if(!vis[i])

{

if(!valid(x,i))

{

continue;

}

if(es[x][i])

{

dfs(i,depth+,e+);

}

else

{

dfs(i,depth+,e);

}

vis[i]=;

}

}

}

int main()

{

memset(test,,sizeof(test));

test[][]=test[][]=test[][]=test[][]=;

test[][]=test[][]=test[][]=test[][]=;

test[][]=test[][]=test[][]=test[][]=;

test[][]=test[][]=test[][]=test[][]=;

int k,m,i,j;

scanf(“%d”,&k);

for(i=;i

{

res=;

memset(vis,,sizeof(vis));

memset(es,,sizeof(es));

cin>>n;

if(n==)

{

cout

continue;

}

for(j=;j

{

int a,b;

cin>>a>>b;

es[a][b]=es[b][a]=;

}

aim_depth=max(,n+);

for(;aim_depth

{

for(j=;j

{

dfs(j,,);

vis[j]=;

}

}

cout

}

return ;

}

hihocoder 1054 滑动解锁 dfs

详细分析见滑动解锁分析 AC代码 #include #include #include #include

hihoCoder#1054 滑动解锁

原题地址 回溯搜索 对于每个待枚举的点,检查: 1. 度数检查:是否违反了出度入度限制.因为生成的路径除了首尾节点外,其他节点的出度和入度只能为2 2. 共线检查:是否违反了共线条件.即跨越了尚未枚举 …

hiho_1054_滑动解锁

题目大意 智能手机九点屏幕滑动解锁,如果给出某些连接线段,求出经过所有给出线段的合法的滑动解锁手势的总数.题目链接: 滑动解锁 题目分析 首先,尝试求解没有给定线段情况下,所有合法的路径的总数.可以使 …

C语言 · 滑动解锁

题目:滑动解锁 滑动解锁是智能手机一项常用的功能.你需要在3×3的点阵上,从任意一个点开始,反复移动到一个尚未经过的”相邻”的点.这些划过的点所组成的有向折线,如果与预设的折线在图 …

深度优先搜索(DFS)

[算法入门] 郭志伟@SYSU:raphealguo(at)qq.com 2012/05/12 1.前言 深度优先搜索(缩写DFS)有点类似广度优先搜索,也是对一个连通图进行遍历的算法.它的思想是从一 …

初涉深度优先搜索–Java学习笔记(二)

挑战程序2.1.4 穷竭搜索>;>;深度优先搜索

深度优先搜索DFS,从最开始状态出发,遍历一种状态到底,再回溯搜索第二种. 题目:POJ2386  思路:(⊙v⊙)嗯  和例题同理啊,从@开始,搜索到所有可以走到的地方,把那里改为一个值(@或者 …

回溯 DFS 深度优先搜索[待更新]

总结A*,Dijkstra,广度优先搜索,深度优先搜索的复杂度比较

广度优先搜索(BFS) 1.将头结点放入队列Q中 2.while Q!=空 u出队 遍历u的邻接表中的每个节点v 将v插入队列中 当使用无向图的邻接表时,复杂度为O(V^2) 当使用有向图的邻接表时, …

随机推荐

抽象和封装_JAVA_OOP

很久没做笔记了,没有以前的刚开始学习软件时候的热情了.包括几年前U盘损坏,数据丢失,通过数据恢复,也只是找回一些零星的碎片. 现在就抽时间把以前的技术笔记找回来,这十条记录在电脑上显示的最后修改日期为 …

C# 如何捕获键盘按钮和组合键以及KeyPress/KeyDown事件之间的区别 (附KeyChar/KeyCode值)

1. 首先将窗口属性KeyPreview设为true,如果属性对话框中找不到,就直接在代码里添加: 2. 添加KeyPress / KeyDown事件: 1.KeyPress 和KeyDown .Ke …

一种M2M业务的架构及实现M2M业务的方法

http://www.cnblogs.com/coryxie/p/3849764.html 技术领域 [0001] 本发明涉及通信技术领域,尤其涉及一种M2M业务的架构及实现M2M业务的方法. 背景技 …

hdu 1542 扫描线求矩形面积的并

很久没做线段树了 求矩形面积的并分析:1.矩形比较多,坐标也很大,所以横坐标需要离散化(纵坐标不需要),熟悉离散化后这个步骤不难,所以这里不详细讲解了,不明白的还请百度2.重点:扫描线法:假想有一条扫 …

dtd语法之定义元素

1.语法: 使用规则: l (#PCDATA) :表示内容为普通文本数据 l EMPTY :表示元素内容必须为空 l ANY :元素出现任意次,一般用 …

.net 调用webservice 总结

最近做一个项目,由于是在别人框架里开发app,导致了很多限制,其中一个就是不能直接引用webservice . 我们都知道,调用webserivice 最简单的方法就是在 “引用” …

CSRF攻击[转]

一.CSRF是什么SRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSR …

vc6.0调试

调试快捷键 : 逐过程调试-F10        逐语句调试-F11跳到光标处-Ctrl+F10   跳出本循环-Shift+F11   设定断点-F9    删除所有断点-Ctrl+Shift+F9 …

React Native学习(九)—— 使用Flexbox布局

文章知识点与官方知识档案匹配,可进一步学习相关知识算法技能树首页概览35079 人正在系统学习中 相关资源:敏捷软件质量保证的方法与实践-其它代码类资源-CSDN文库

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月19日
下一篇 2021年4月19日

相关推荐