简单的字谜游戏--可扩展--2015年7月25日14:58:00V1.1版
1、string类find匹配法
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;
//字谜单词 hone,uito,raia,enan
int main()
{int n = 6;char puzzle[6][6]= //字谜数组{'a','h','o','n','e','u','f','m','j','b','i','k','r','o','o','t','a','f','a','n','o','s','a','d','i','t','m','n','d','c','a','h','e','n','a','n'};
//测试puzzle数组
// for(int i = 0; i < n; i++)
// {
// for(int j = 0; j < n; j++)
// {
// cout<<puzzle[i][j];
// }
// cout<<endl;
// }string ptmp[8]; //存储puzzle的一段for(int i = 0; i < 6; i++){for(int j = 0; j < 6; j++){ptmp[i].append(1,puzzle[i][j]); //存储第一行到第六行if(i == j){ptmp[6].append(1,puzzle[i][j]); //存储正斜对角}if(i + j == 5){ptmp[7].append(1,puzzle[i][j]); //存储逆斜对角}}}
//测试ptmp数组
// for(int i = 0; i < 8; i++)
// {
// cout<<ptmp[i]<<endl;
// }ifstream filedic("G:\\wordlist.txt"); //从文件中读取数据if(!filedic.is_open()) //如果没打开,错误提示{cout << "Error: file opening failure."<<endl;return -1;}while(!filedic.eof()) //当文件未到尾部,继续循环{string tmp; //存储文件提取字符串filedic >> tmp; //提取字符串for(int i = 0; i < 8; i++) //循环判断tmp与ptmp数组里的字符匹配{//如果发现,则输出//PS:这里用string类里面的find函数进行模式匹配//PS:因为字典过大,这里限制了字谜的长度,如不需要,可以去掉if(ptmp[i].find(tmp,0) != ptmp[i].npos && tmp.length() == 4){cout << tmp << endl;}}}filedic.close();return 0;
}
2、KMP匹配法
#include <iostream>
#include <string>
#include <cstring>
#include <fstream>
using namespace std;
//字谜单词 hone,uito,raia,enanvoid makenext(const string str,int next[]) //next数组
{next[0] = 0;int maxs; //最大前缀后缀相等数目for(int i = 1,maxs = 0;i < str.length(); i++){while( maxs > 0 && str.at(maxs) != str.at(i)) //当前缀下一位不等于后缀下一位时{//当匹配失败时,找到一个前缀序列,再与后缀匹配//a[0]...a[maxs].... a[i-maxs]...a[i-1] a[i]...// 匹配 匹配 匹配失败// a[0]....a[max-1] a[max]...// 匹配 判断是否匹配// a[0]...a[j-1] a[j]maxs = next[maxs - 1]; //next[max - 1]相当于匹配失败后,前缀作为后缀,所对应的前缀}if(str.at(maxs) == str.at(i)) //如果maxs和i匹配,则最大前缀后缀数目+1{maxs++;}next[i] = maxs;}// 测试输出
// cout<< str << endl;
// for(int i = 0; i < str.length(); i++)
// cout << next[i] << " ";
// cout << endl;
}bool KMP(const string motherstr,const string patternstr,int next[]) //KMP算法
{int maxs; //最大前缀后缀相等数目makenext(patternstr,next);for(int i = 0,maxs = 0; i < motherstr.length(); i++){while(maxs > 0 && patternstr[maxs] != motherstr[i]) //当前缀下一位不等于后缀下一位时{//PS:这里的原理和makeNext方法里面一样,只不过这里的模式串是patterntr,母串是mothertrmaxs = next[maxs - 1];}if(patternstr[maxs] == motherstr[i]) //如果maxs和i匹配,则最大前缀后缀数目+1{maxs++;}if(maxs == patternstr.length()) //当最大前缀后缀相等数目与patternstr一样长时,则证明匹配成功{//测试匹配成功时,返回patternstr在motherstr里的位置//cout<<i-maxs+1;return true;}}return false;
}
int main()
{
//测试KMP算法是否正确
// string str1= "aaaac";
// string str2= "aaaa";
// int next[100];
// if(KMP(str1,str2,next))
// cout<<"Yes."<<endl;
// else
// cout<<"NO."<<endl;int n = 6;char puzzle[6][6]= //字谜数组{'a','h','o','n','e','u','f','m','j','b','i','k','r','o','o','t','a','f','a','n','o','s','a','d','i','t','m','n','d','c','a','h','e','n','a','n'};
//测试puzzle数组
// for(int i = 0; i < n; i++)
// {
// for(int j = 0; j < n; j++)
// {
// cout<<puzzle[i][j];
// }
// cout<<endl;
// }string ptmp[8]; //存储puzzle的一段for(int i = 0; i < 6; i++){for(int j = 0; j < 6; j++){ptmp[i].append(1,puzzle[i][j]); //存储第一行到第六行if(i == j){ptmp[6].append(1,puzzle[i][j]); //存储正斜对角}if(i + j == 5){ptmp[7].append(1,puzzle[i][j]); //存储逆斜对角}}}
//测试ptmp数组
// for(int i = 0; i < 8; i++)
// {
// cout<<ptmp[i]<<endl;
// }ifstream filedic("G:\\wordlist.txt"); //从文件中读取数据if(!filedic.is_open()) //如果没打开,错误提示{cout << "Error: file opening failure."<<endl;return -1;}while(!filedic.eof()) //当文件未到尾部,继续循环{int next[1000]; //next数组string tmp; //存储文件提取字符串filedic >> tmp; //提取字符串for(int i = 0; i < 8; i++) //循环判断tmp与ptmp数组里的字符匹配{//如果发现,则输出//PS:KMP匹配法//PS:因为字典过大,这里限制了字谜的长度,如不需要,可以去掉if(KMP(ptmp[i],tmp,next)&& tmp.length() == 4){cout<< tmp << endl;}}}filedic.close();return 0;
}
3、优化KMP算法(待实现)
PS:运行后发现string类中的匹配算法比KMP算法要快,不解释啊,有时间写完优化KMP算法再比较下。
简单的字谜游戏--可扩展--2015年7月25日14:58:00V1.1版相关推荐
- KMP算法(待优化)--2015年7月25日14:04:25V1.0版
#include <iostream> #include <string> #include <cstring> using namespace std;void ...
- 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)
day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复 ...
- 我来说说2015年8月25日锤子科技夏季手机发布会的内情
我来说说2015年8月25日锤子科技夏季手机发布会的内情, 虽然我也没去现场,我也不是锤子科技的,我跟锤子科技的人也不熟.那算什么内情啊?好吧,改一下,我来瞎说一下2015锤子科技夏季手机发布会的内情 ...
- 迷宫问题(栈解决)--2015年8月9日19:23:23v1.0版
1.问题描述 多年以来,迷宫问题一直是令人感兴趣的题目.实验心理学家训练老鼠在迷宫中寻找食物.许多神秘主义小说家也曾把英国乡村花园迷宫作为谋杀现场.计算机工作者也对迷宫感兴趣.因为它可以展现栈的巧妙应 ...
- 各种搜索算法比较--2015年7月26日16:42:45V1.0版
1.顺序查找 int SequenceSearch(int a[],int n,int key) //顺序查找 {for(int i = 0; i < n; i++){if(key == a[i ...
- 各种排序算法比较--2015年7月23日22:33:43v1.0版
#include <iostream> #include <fstream> #include <cstdlib> #include <ctime> u ...
- 2015年2月25日
二叉树遍历的递归与非递归实现 本次测试实现了二叉树先序遍历的递归与非递归实现,并测试了其性能,测试结果如预先考虑的一致,就是非递归的性能要不递归的性能高. 同时也实现了二叉树的广度优先的遍历,通过qu ...
- linux运维实战练习-2015年9月13日-9月15日课程作业(练习)安排
一.作业(练习)内容: 1.描述shell程序的运行原理(可附带必要的图形说明): 2.总结shell编程中所涉及到的所有知识点(如:变量.语法.命令状态等等等,要带图的哟): 3.总结课程所讲的所有 ...
- 始于2015年11月23日,终于2018年08月08日
留念. 2015年11月23日:在一起 2016年01月17日-21日:北京机场,我们❤ 2016年04月16日:去他所在城市--成都 2016年06月04-06日:第一次小旅游--都江堰.青城山 2 ...
最新文章
- Python pytagcloud 中文分词 生成标签云 系列(一)
- 一文概述 2018 年深度学习 NLP 十大创新思路
- C# System.Guid.NewGuid() 格式化
- SilverLight学习笔记--建立Silverlight自定义控件(5)--绑定动画效果
- python如何使用字典中的值并进行比较_python – 如何比较字典中的值?
- 【Web自动化测试——代码篇十二】自动化测试模型——数据驱动测试和关键字驱动测试...
- Tensorflow中文文档
- 石青建站养站大师 v1.8.6.1
- java多线程通信方法
- 学习笔记 十一 : iscsi
- web页面的回流,认识与避免
- FPS游戏-罗技鼠标-通用的压枪宏
- HiJson(Json格式化工具)64位 V2.1.2绿色版
- iot行业的流量规律
- 波士顿动力Spot mini,MIT 猎豹、宇树科技、蔚蓝四足机器人类别
- Python快速入门(1)常用容器和内置函数介绍
- 湖南大学夏令营c语言考试题,夏令营试题
- 2018年看书计划(40本)
- 什么叫域名解析SSL证书?
- JS JavaScript入门