求安卓九宫格密码的全部组合 深度优先遍历算法
来源:互联网 发布:网络黄金合法吗 编辑:程序博客网 时间:2024/06/05 18:42
基本思想:
九宫格的排列组合 ,实际上就是划出一条路径,使用dfs 确定路径,当路径长度 大于4时 计数加一
要求:
1 九个点 任意两点 都能到达 但是中间有其他点分隔那就不行
2 如果中间相隔的点是已经走过的点,那么可以跳过 这个点
分析:
要求1:每个点可能 可以行动的方向
16个方向
为了统一起来编程方便 每个点都要尝试这16个方向,然后判断是否出界
要求2:跳点,如果预访问下一个点时发现被访问过,那么沿这条直线跳过这个点尝试访问,正后面的那个点
代码:
#include<stdio.h>#include<string.h>int visit[3][3];int dx[16] = {-1, -1,0, 1, 1,1,0,-1,-2 ,-1, 1,2,2,1,-1,-2};//16个方向 int dy[16] = {0, -1,-1,-1,0,1,1, 1,-1, -2,-2,-1,1,2,2,1};int count = 0;void dfs(int x,int d){ int m = x / 3;int n = x % 3;visit[m][n] = 1;if (d >= 4)count++;for (int i = 0; i < 16; i++){int tm = m + dx[i];int tn = n + dy[i];if (tm<0 || tm>2 || tn<0 || tn>2)continue;if ( visit[tm][tn]==0)dfs(tm*3+tn,d+1);else if (visit[tm][tn] == 1){//跳过这个点 方法是 将方向坐标再加一次 tm = tm + dx[i];tn = tn + dy[i];if (tm<0 || tm>2 || tn<0 || tn>2)continue;if (visit[tm][tn] == 0)dfs(tm * 3 + tn, d + 1);}}visit[m][n] = 0;}int main(){count = 0;memset(visit,0,sizeof(visit));for (int i = 0; i < 9; i++){dfs(i, 1);}printf("%d\n",count);return 0;}
答案是389112
如果打印出具体路径 设一个全局栈 用来记录就可以了
0 0
- 求安卓九宫格密码的全部组合 深度优先遍历算法
- 图的深度优先遍历和广度优先遍历算法
- 树的广度优先遍历与深度优先遍历算法
- 图的深度优先遍历算法
- 图的深度优先遍历算法
- 深度优先算法,图的遍历
- 深度优先遍历算法的非递归
- 图的深度优先遍历算法
- 图的深度优先遍历算法
- 图的深度优先遍历算法
- 【算法】图的深度优先遍历
- 深度优先算法、广度优先算法 与 图的遍历
- python深度优先与广度优先的遍历算法比较
- 深度优先算法求含有N个元素的集合的全部组合(即:在集合中选1,2,3...N个元素的所有组合,不是排列)
- 深度优先、广度优先和A*算法实现的重排九宫问题
- 图的邻接矩阵生成算法,深度优先遍历算法,广度优先遍历算法,Prime算法。):
- 组合运算——深度优先遍历
- 深度优先和广度优先遍历算法
- web.xml文件介绍
- LoadRunner设置检查点的方法有哪些
- Hibernate状态 (merge,attachDirty,attachClean)
- POJ3268之最短路
- C++ 模拟浏览器发送HTTP请求
- 求安卓九宫格密码的全部组合 深度优先遍历算法
- SyntaxError: Non-ASCII character
- SpringMVC + Kindeditor时List items = upload.parseRequest(request);为空
- swift UIButton使用
- JSON资料整理
- 数据挖掘 决策树算法 ID3 通俗演绎
- 两种方式创建单利
- 今天好像快下雨了,心情呢
- android:descendantFocusability用法简析