求安卓九宫格密码的全部组合 深度优先遍历算法

来源:互联网 发布:网络黄金合法吗 编辑:程序博客网 时间: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
原创粉丝点击