当前位置:编程学习 > 网站相关 >>

深度搜索破密码

百度一面的一道题目,今天才想起来实现以下,给面试官说的时候没表达清楚,现在想想原因还是对递归掌握的深度不够,逻辑没有表达好.
 
下面是代码,其中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刷题了,对字符串和字符数组的一些基础知识忘了,真心惭愧.
补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,