深度搜索破密码
百度一面的一道题目,今天才想起来实现以下,给面试官说的时候没表达清楚,现在想想原因还是对递归掌握的深度不够,逻辑没有表达好.下面是代码,其中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刷题了,对字符串和字符数组的一些基础知识忘了,真心惭愧.
补充:综合编程 , 安全编程 ,