9个点一笔画的算法求解,送上100分

shuxieweilai 2012-12-28 12:59:25
差不多一年没登过csdn了,偶尔也只是登着下载文档,在公司基本天天写lua ,写bat等等的脚本,c++也接触甚少,更别提算法了,然今天吃饭和同事讨论起了一个算法,自己几乎忘的一干二净,在此请教下大家:
现在有种手机解锁是9个数字键,让你一笔画完的,而后我们就开始探讨起这样一笔画有几种可能性,也算是一个图论和排列组合的东西了,动态规划也不知道怎么用了,图论也忘鸟,遂请教大神们有什么好的方法呢,效率要尽量高哦。 我想着将他改了另外一种问题: 有1到9数字的九个球,他们所有的排列组合中,满足前面的数字和后面的数字差的绝对值为1或者3或者4的排列组合有几种。
ps:好怀念大学的时候可以自己玩玩算法,虽然是个菜鸟,但至少年轻过。 一直忠实于c++ 板块,遂继续发到这里!
...全文
995 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-01-08
  • 打赏
  • 举报
回复
引用 19 楼 shuxieweilai 的回复:
引用 17 楼 zhao4zhong1 的回复:“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 …… 感谢你的回答 分少不了你的,看看我的结贴率就知道了, 只是最近工作忙, 很少上csdn,另外你的方法其实太过普遍,从九个点选一个为起点,然后遍历附近可能到的点,然后已经经过之后标记为已走,但效率实在太低。 再过一周没有好的答案我就结贴了
关键是看谁能给出一个效率高的能实际运行的例子来跨越“说”和“做”之间的鸿沟!
szulee 2013-01-08
  • 打赏
  • 举报
回复
//1 2 3 //4 5 6 求一笔划过所有9个键的所有方法 //7 8 9 思路 1.遍历所有排列 2.筛选 排列总个数为: P(9, 2) + P(9, 3) + P(9, 4) + P(9, 5) + P(9, 6) + P(9, 7) + P(9, 8) + P(9, 9) 筛选条件例子: 如:159 成立 19不成立 143不成立 难点: 设计 筛选条件。
shuxieweilai 2013-01-07
  • 打赏
  • 举报
回复
引用 17 楼 zhao4zhong1 的回复:
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 C/C++ code?123456789101……
感谢你的回答 分少不了你的,看看我的结贴率就知道了, 只是最近工作忙, 很少上csdn,另外你的方法其实太过普遍,从九个点选一个为起点,然后遍历附近可能到的点,然后已经经过之后标记为已走,但效率实在太低。 再过一周没有好的答案我就结贴了
赵4老师 2013-01-06
  • 打赏
  • 举报
回复
这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。
赵4老师 2013-01-06
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门! 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
//1 2 3
//4 5 6 求一笔划过所有9个键的所有方法
//7 8 9
#include <stdio.h>
int g[10][9]={
    {0,0,0,0,0,0,0,0,0},
    {2,4,5,0,0,0,0,0,0},//1
    {1,3,4,5,6,0,0,0,0},//2
    {2,5,6,0,0,0,0,0,0},//3
    {1,2,5,7,8,0,0,0,0},//4
    {1,2,3,4,6,7,8,9,0},//5
    {2,3,5,8,9,0,0,0,0},//6
    {4,5,8,0,0,0,0,0,0},//7
    {4,5,6,7,9,0,0,0,0},//8
    {5,6,8,0,0,0,0,0,0},//9
};
int k,i,n;
int h[10];//记录是否划过h[1..9],history
int p[10];//记录划的顺序p[1..9],path
void go(int f,int L) {
    int j;

    if (L==9) {
        p[L]=f;
        n++;
        printf("%08d:",n);
        for (i=1;i<=9;i++) printf(" %d",p[i]);
        printf("\n");
    } else {
        p[L]=f;
        h[f]=1;
        j=0;
        while (1) {
            if (g[f][j]==0) break;
            if (h[g[f][j]]==0) {
                go(g[f][j],L+1);
                h[g[f][j]]=0;
            }
            j++;
        }
    }
}
int main() {
    n=0;
    for (k=1;k<=9;k++) {
        for (i=1;i<=9;i++) h[i]=0;
        go(k,1);
    }
    return 0;
}
//00000001: 1 2 3 5 4 7 8 6 9
//00000002: 1 2 3 5 4 7 8 9 6
//00000003: 1 2 3 5 6 9 8 4 7
//00000004: 1 2 3 5 6 9 8 7 4
//00000005: 1 2 3 5 7 4 8 6 9
//00000006: 1 2 3 5 7 4 8 9 6
//00000007: 1 2 3 5 9 6 8 4 7
//00000008: 1 2 3 5 9 6 8 7 4
//00000009: 1 2 3 6 5 4 7 8 9
//00000010: 1 2 3 6 5 7 4 8 9
//00000011: 1 2 3 6 5 9 8 4 7
//00000012: 1 2 3 6 5 9 8 7 4
//00000013: 1 2 3 6 8 4 7 5 9
//00000014: 1 2 3 6 8 7 4 5 9
//00000015: 1 2 3 6 8 9 5 4 7
//00000016: 1 2 3 6 8 9 5 7 4
//00000017: 1 2 3 6 9 5 4 7 8
//00000018: 1 2 3 6 9 5 4 8 7
//00000019: 1 2 3 6 9 5 7 4 8
//00000020: 1 2 3 6 9 5 7 8 4
//00000021: 1 2 3 6 9 5 8 4 7
//00000022: 1 2 3 6 9 5 8 7 4
//00000023: 1 2 3 6 9 8 4 5 7
//00000024: 1 2 3 6 9 8 4 7 5
//00000025: 1 2 3 6 9 8 5 4 7
//00000026: 1 2 3 6 9 8 5 7 4
//00000027: 1 2 3 6 9 8 7 4 5
//00000028: 1 2 3 6 9 8 7 5 4
//00000029: 1 2 4 5 3 6 9 8 7
//00000030: 1 2 4 5 7 8 9 6 3
//00000031: 1 2 4 7 5 3 6 8 9
//00000032: 1 2 4 7 5 3 6 9 8
//00000033: 1 2 4 7 5 8 9 6 3
//00000034: 1 2 4 7 5 9 8 6 3
//00000035: 1 2 4 7 8 5 3 6 9
//00000036: 1 2 4 7 8 5 9 6 3
//00000037: 1 2 4 7 8 6 3 5 9
//00000038: 1 2 4 7 8 6 9 5 3
//00000039: 1 2 4 7 8 9 5 3 6
//00000040: 1 2 4 7 8 9 5 6 3
//00000041: 1 2 4 7 8 9 6 3 5
//00000042: 1 2 4 7 8 9 6 5 3
//00000043: 1 2 4 8 7 5 3 6 9
//00000044: 1 2 4 8 7 5 9 6 3
//00000045: 1 2 4 8 9 6 3 5 7
//00000046: 1 2 5 3 6 9 8 4 7
//00000047: 1 2 5 3 6 9 8 7 4
//00000048: 1 2 5 4 7 8 9 6 3
//00000049: 1 2 5 7 4 8 9 6 3
//00000050: 1 2 6 3 5 4 7 8 9
//00000051: 1 2 6 3 5 7 4 8 9
//00000052: 1 2 6 3 5 9 8 4 7
//00000053: 1 2 6 3 5 9 8 7 4
//00000054: 1 2 6 9 8 4 7 5 3
//00000055: 1 2 6 9 8 7 4 5 3
//00000056: 1 4 2 3 5 6 9 8 7
//... ...
//00000776: 9 8 7 4 5 6 3 2 1
//00000777: 9 8 7 5 1 4 2 3 6
//00000778: 9 8 7 5 1 4 2 6 3
//00000779: 9 8 7 5 3 6 2 1 4
//00000780: 9 8 7 5 3 6 2 4 1
//00000781: 9 8 7 5 4 1 2 3 6
//00000782: 9 8 7 5 4 1 2 6 3
//00000783: 9 8 7 5 6 3 2 1 4
//00000784: 9 8 7 5 6 3 2 4 1
nice_cxf 2013-01-05
  • 打赏
  • 举报
回复
写程序倒是简单,遍历+回溯就是了,1379三个连接,2468有5个连接,5有8个连接
idealgod123 2013-01-05
  • 打赏
  • 举报
回复
引用 2 楼 turingo 的回复:
假设路径是有方向性的,假设每个点只经过一次,那么算是一个排列问题,总数为: P(9, 2) + P(9, 3) + P(9, 4) + P(9, 5) + P(9, 6) + P(9, 7) + P(9, 8) + P(9, 9)
在这两个条件的基础上,要考虑的是起点和何时经过5的问题,因为如果作为3*3的矩阵,经过5后必定需要经过一个临界点才能达到目的,比如讲‘1,2,5’后只能是3和4,这样就只剩下两个选择,因为5不可能再作为一个点,所以下面的图形只有直线和三角形,且是不包含已经过点的三角形···(有事,来不及继续分析了,只能到这了。谅解·)
hackbuteer1 2013-01-05
  • 打赏
  • 举报
回复
看来是个排列组合问题啊
programer.M 2013-01-05
  • 打赏
  • 举报
回复
脑袋要烧掉了~~~
prajna 2012-12-29
  • 打赏
  • 举报
回复
這問題不簡單,看看別人有什麽好辦法.
szulee 2012-12-29
  • 打赏
  • 举报
回复
引用 2 楼 turingo 的回复:
假设路径是有方向性的,假设每个点只经过一次,那么算是一个排列问题,总数为: P(9, 2) + P(9, 3) + P(9, 4) + P(9, 5) + P(9, 6) + P(9, 7) + P(9, 8) + P(9, 9)
没考虑到有些点是不能连续一起的 比如说左上角的点不能直接到右下角的点。
bqw2008 2012-12-29
  • 打赏
  • 举报
回复
用3X3的方图试试
赵4老师 2012-12-28
  • 打赏
  • 举报
回复
小学奥数似乎也有类似题目。
赵4老师 2012-12-28
  • 打赏
  • 举报
回复
《概率论与数理统计》
shuxieweilai 2012-12-28
  • 打赏
  • 举报
回复
引用 2 楼 turingo 的回复:
假设路径是有方向性的,假设每个点只经过一次,那么算是一个排列问题,总数为: P(9, 2) + P(9, 3) + P(9, 4) + P(9, 5) + P(9, 6) + P(9, 7) + P(9, 8) + P(9, 9)
你的两个假设都成立,但是没明白结论怎么出来的
shuxieweilai 2012-12-28
  • 打赏
  • 举报
回复
引用 3 楼 nice_cxf 的回复:
3*3的方块?只可以上下左右连的? 如果是,1开头6种,3,7,9开头同1,5开头8种,2468开头无解
可以斜着四个方向, 所以一共有8个方向!
ying0620 2012-12-28
  • 打赏
  • 举报
回复
http://zh.wikipedia.org/wiki/%E6%9F%AF%E5%B0%BC%E6%96%AF%E5%A0%A1%E4%B8%83%E6%A1%A5%E9%97%AE%E9%A2%98
rocktyt 2012-12-28
  • 打赏
  • 举报
回复
如果是那个9点画线解锁的,有几个已知条件 最少要求4个点 同一直线上的3个点,不能跳过中间点的直接从一边画到另一边
nice_cxf 2012-12-28
  • 打赏
  • 举报
回复
3*3的方块?只可以上下左右连的? 如果是,1开头6种,3,7,9开头同1,5开头8种,2468开头无解
图灵狗 2012-12-28
  • 打赏
  • 举报
回复
假设路径是有方向性的,假设每个点只经过一次,那么算是一个排列问题,总数为: P(9, 2) + P(9, 3) + P(9, 4) + P(9, 5) + P(9, 6) + P(9, 7) + P(9, 8) + P(9, 9)
加载更多回复(1)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧