深度搜索破解密码

百度一面的一道题目,今天才想起来实现以下,给面试官说的时候没表达清楚,现在想想原因还是对递归掌握的深度不够,逻辑没有表达好.

下面是代码,其中characters里存放的是密码可能出现的字符,我这里只存了几个,比较方便,不然执行时间过长.
[cpp] view plaincopy
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
//char characters[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’};
char characters[] = {‘a’, ‘b’, ‘c’, ‘d’, ‘1’, ‘2’, ‘3’};
char pwd[6];
char ans[6];
bool flag = false;
int count = 0;
void breakPwd(char *pwd, char *ans, int dep)
{
    if(flag == true) return;
    if(dep >= 6)
    {
        int i = 0;
        for(i=0; i<6; i++)
        {
            if(pwd[i] != ans[i])
                break;
        }
        if(i == 6)
        {
            printf(“password = “);
            for(i=0; i<6; i++)
                printf(“%c”, ans[i]);
            printf(”  break the pwd successful!\n”);
            flag = true;
            return;
        }
        /*测试递归函数的执行过程,返回true后函数会继续执行,如何停止递归呢???*/
        else
        {
            count++;
            printf(“%d\n”, count);
        }
    }
    else
    {
        for(int i=0; i<sizeof(characters); i++)
        {
            ans[dep] = characters[i];
            if(flag == false)
            {
                breakPwd(pwd, ans, dep+1);
            }
        }
    }
    /*在dep>=6时程序执行了if语句部分,而跳过else部分,因此在此处设置ans[dep]=’0’*/
    if(flag == false)
        ans[dep] = ‘0’;
    return;
}
void test()
{
    const char *s = “exit”;
    while(scanf(“%s”, pwd) != EOF)
    {
        count = 0;
        if(strcmp(pwd, s) == 0)break;
        memset(ans, ‘\0’, sizeof(ans));
        breakPwd(pwd, ans, 0);
    }
}
int main()
{
    test();
    return 0;
}
好久没在poj刷题了,对字符串和字符数组的一些基础知识忘了,真心惭愧.

转载请注明: 本文转载自中国蓝客联盟官方团队博客
本文链接地址: 深度搜索破解密码

发表评论

电子邮件地址不会被公开。 必填项已用*标注

人类验证码: 如果无法查看图片请刷页面