有条件的 搜索一个字典

programm123 2009-03-03 03:06:40
我有一个法语单词txt文件,在c++ fstream fin 后

用户要输入6个单词,那些单词的位置就如图中所示(数字代表输入次序).
输入后.开始搜索法语单词txt文件里 附合的词语.
(目的是找出所有附合条件的字)


但搜索是有条件的
在图中,每一个单词只可和邻格或斜格的词语组合,
例如,cedrat,dreact,cedr 等是容许的
但dctr,terc,cre ,rdta ,ceardt等是不容许的.

最后将附合条件的结果 根据字的长度 长短 依次排列
如:
cadret
draect
caerd
dreat
teard
read
tear
car
dea
...

...全文
238 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
programm123 2009-03-05
  • 打赏
  • 举报
回复
up
programm123 2009-03-04
  • 打赏
  • 举报
回复
能写一个完整的吗...?
  • 打赏
  • 举报
回复
搞不来打
梅文海 2009-03-03
  • 打赏
  • 举报
回复
就是一个随机组合的问题了,无法是弄一个嵌套循环,外循环是所有字符,内循环的范围是是外循环变量的正负三
programm123 2009-03-03
  • 打赏
  • 举报
回复
是求代码的
图片连结在上面,看不见图片请告诉我
谢谢
programm123 2009-03-03
  • 打赏
  • 举报
回复
[URL=http://p15.freep.cn/p.aspx?u=v20_p15_p_0903031044288709_0.jpg&click=1][IMG]http://p15.freep.cn/p.aspx?u=v20_p15_p_0903031044288709_0.jpg[/IMG][/URL]
ryfdizuo 2009-03-03
  • 打赏
  • 举报
回复
pic?
  • 打赏
  • 举报
回复
你是求代码,还是改错?看不到图片啊.
blpluto 2009-03-03
  • 打赏
  • 举报
回复
没图~~~~
ltc_mouse 2009-03-03
  • 打赏
  • 举报
回复
看不到图,呵呵~
ltc_mouse 2009-03-03
  • 打赏
  • 举报
回复
给一段递归算法,求出满足某种条件的所有排列~
改造DataHandle函数,变成匹配字典文件,再做排序、输出等处理

/////////////////////////////////////////////////////////////////////////////////////////
//!
//! \brief 用递归算法求满足特定条件的排列
//!
//! \param[in,out] list 数组元素
//! \param[in] pos 递归中正在处理第几个元素
//! \param[in] end 最后一个元素的下标
//! \param[in] condition 排列递归过程中判断数组是否满足条件
//! \param[in] output 用于输出排列数,可做其他操作
//!
/////////////////////////////////////////////////////////////////////////////////////////
void PermWithCondition( int list[], int pos, int end, int (*condition)(int[],int), void (*output)(int[],int,int) )
{
if( pos <= end )
{
int i;
for(i = pos; i <= end; i++)
{
int tmp;
tmp = list[pos], list[pos] = list[i], list[i] = tmp; //swap(&list[k], &list[i]);
if( condition(list,pos) )
{
output(list, pos, end);
PermWithCondition(list, pos + 1, end, condition, output);
}
tmp = list[pos], list[pos] = list[i], list[i] = tmp; //swap(&list[k], &list[i]);
}
}
}

//////////////////////////////////////////////////////////////////////////////////////
//
// 求满足条件的排列. 条件为相邻两个数距离在3以内
//
//////////////////////////////////////////////////////////////////////////////////////
static int g_PermCount = 0;
static void DataHandle( int list[], int pos, int end )
{
//list保存的是满足条件的序列,容易得到对应的字符串,再查字典即可实现lz的需求
if( pos >= 0 && pos <= end )
{
for(int i=0; i <= pos; ++i)
cout << list[i];
cout << "\t";
++ g_PermCount;
}
}
static int CheckCondition( int list[], int pos )
{
//递归条件判断,即7楼指出的正负3
if( 0 == pos
|| (list[pos-1]-3 <= list[pos] && list[pos] <= list[pos-1]+3) )
{
return 1;
}
return 0;
}
void PermTest( void )
{
int list[] = { 1, 2, 3, 4, 5, 6 };
PermWithCondition( list, 0, 5, CheckCondition, DataHandle );
cout << endl << "g_PermCount=" << g_PermCount << endl;
}
phoenix01 2009-03-03
  • 打赏
  • 举报
回复
图搜索,
1)先建立图的数据结构
2)搜索相关路径
(设置好条件)


我想知道你者个题目的具体应用是什么
programm123 2009-03-03
  • 打赏
  • 举报
回复
ohhh!
一言惊醒梦中人
但是我不懂写...
很多都还没学
jieao111 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 programm123 的回复:]
一开始,用户是要输入六个英文字母,
幻想那些字母是 输入到六个格子里,
格子里的数字是表示,第一个键入的字母 输入到1格,第2个输入的字母到2格

这六个格子就是表达了我要搜索的条件
每一个格子里的英文字只可和邻格或斜格的字组合
每个格子只可以用一次

明白吗?不明白我可以再详细说明,谢谢你的帮忙
[/Quote]原来是这个意思。。编程确实可以实现,虽然说只有六个字母,求个幂集,再来个全排列复杂度不是很大,但是我想先写个RE,在搜索的对话框内只需要勾选住“使用正则表达式”,然后按一下搜索就可以了,,
programm123 2009-03-03
  • 打赏
  • 举报
回复

要学到你所说的那个阶段 要多久
你写这个代码要多少个小时?
hityct1 2009-03-03
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 programm123 的回复:]
先谢谢你
还有其他意见吗...
我还没有学到这么高阶的应用
不过大家有想法就说出来吧

最好能提供代码,哈哈,谢谢
[/Quote]

没啥高级的,都是基本的。
programm123 2009-03-03
  • 打赏
  • 举报
回复
先谢谢你
还有其他意见吗...
我还没有学到这么高阶的应用
不过大家有想法就说出来吧

最好能提供代码,哈哈,谢谢
hityct1 2009-03-03
  • 打赏
  • 举报
回复
我的想法:
简化问题,大致思路先搜索所有满足条件的排列(先不管是否是单词),然后将这些结果依次在字典里查找。

先预处理一下:
假设输入的是ABCDEF(用编译原理的术语,都是非终结符)
1)建立邻接矩阵表b,相邻的则为true,否则为false
2)列出所有的排列,包括六选六的排列,六选五的排列,......,六选一的排列。这个比较容易
3)将所有排列按规则排序。
4)根据邻接矩阵表b剔除不符合要求的排列。
5)将剩余的排列保存到文件中。

使用时,先将文件读出(如存入到链表中);然后对于输入的6个字母(当成终结符),替换掉非终结符;最后到字典里查找就行了。
programm123 2009-03-03
  • 打赏
  • 举报
回复
一开始,用户是要输入六个英文字母,
幻想那些字母是 输入到六个格子里,
格子里的数字是表示,第一个键入的字母 输入到1格,第2个输入的字母到2格

这六个格子就是表达了我要搜索的条件
每一个格子里的英文字只可和邻格或斜格的字组合
每个格子只可以用一次

明白吗?不明白我可以再详细说明,谢谢你的帮忙
jieao111 2009-03-03
  • 打赏
  • 举报
回复
题意不是很清楚。“输入6个单词”是干什么用的,还有输入的次序有什么用?

如果看你的搜索条件的话,可以考虑用正则表达式,应该有这样一个RE(想了一下,可以构造出来一台NFA,所以绝对存在这样的一个RE)..

64,637

社区成员

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

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