uva 10010
2016-07-23 23:05
309 查看
关于搜索的一道简单题。从一个字符块中搜出指定的单词,单词在字符块中的位置可以是水平,垂直,或者对角线共8个方向中的任意一个。
注意:单词的所在的位置一定是一条直线。刚开始我把这道题当做dfs做,结果wa了好多次。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <memory.h>
using namespace std;
const int maxn = 50;
int m, n, wordnum, wordlength, rr, rc;
string str[maxn], words[maxn], curWord;
bool vis[maxn][maxn], found = false;
int dr[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dc[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
bool inMap(int r, int c)
{
if (r >= m || r < 0 || c >= n || c < 0)
return false;
return true;
}
//level 当前需要去查询的字母位置(基于0)
/*
void dfs(int level, int curr, int curc)
{
if (level == wordlength)
{
found = true;
return;
}
int nexr, nexc;
for (int i = 0; i < 8; i++)
{
nexr = curr + dr[i]; nexc = curc + dc[i];
if (inMap(nexr, nexc) && !vis[nexr][nexc] &&
(curWord[level] == str[nexr][nexc]))
{
vis[nexr][nexc] = true;
dfs(level + 1, nexr, nexc);
vis[nexr][nexc] = false;
}
if (found)
return;
}//for
}
*/
void search(int curr, int curc)
{
int i, j;
int orr = curr, orc = curc;
for (i = 0; i < 8; i++)
{
for (j = 1; j < curWord.length(); j++)
{
int nexr = curr + dr[i], nexc = curc + dc[i];
if (inMap(nexr, nexc) && str[nexr][nexc] == curWord[j])
{
curr = nexr;
curc = nexc;
}
else
break;
}
if (j == curWord.length())
{
found = true;
break;
}
curr = orr, curc = orc;
}
}
void inputwork()
{
cin >> m >> n;
for (int i = 0; i < m; i++)
cin >> str[i];
cin >> wordnum;
for (int i = 0; i < wordnum; i++)
cin >> words[i];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
str[i][j] = tolower(str[i][j]);
}
for (int i = 0; i < wordnum; i++)
{
for (int j = 0; j < words[i].length(); j++)
words[i][j] = tolower(words[i][j]);
}
}
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int kasenum;
cin >> kasenum;
while (kasenum--)
{
inputwork();
for (int k = 0; k < wordnum; k++)
{
wordlength = words[k].length();
memset(vis, false, sizeof(vis));
found = false;
curWord = words[k];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (str[i][j] == words[k][0])
{
/*
memset(vis, false, sizeof(vis));
vis[i][j] = true;
dfs(1, i, j);
vis[i][j] = false;
*/
search(i, j);
}
if (found)
{
rr = i, rc = j;
break;
}
}
if (found)
break;
}
cout << rr + 1<< " " << rc+1 << endl;
}//for wordnum
if (kasenum != 0)
cout << endl;
}//while kasenum--
return 0;
}
注意:单词的所在的位置一定是一条直线。刚开始我把这道题当做dfs做,结果wa了好多次。
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
#include <memory.h>
using namespace std;
const int maxn = 50;
int m, n, wordnum, wordlength, rr, rc;
string str[maxn], words[maxn], curWord;
bool vis[maxn][maxn], found = false;
int dr[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
int dc[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
bool inMap(int r, int c)
{
if (r >= m || r < 0 || c >= n || c < 0)
return false;
return true;
}
//level 当前需要去查询的字母位置(基于0)
/*
void dfs(int level, int curr, int curc)
{
if (level == wordlength)
{
found = true;
return;
}
int nexr, nexc;
for (int i = 0; i < 8; i++)
{
nexr = curr + dr[i]; nexc = curc + dc[i];
if (inMap(nexr, nexc) && !vis[nexr][nexc] &&
(curWord[level] == str[nexr][nexc]))
{
vis[nexr][nexc] = true;
dfs(level + 1, nexr, nexc);
vis[nexr][nexc] = false;
}
if (found)
return;
}//for
}
*/
void search(int curr, int curc)
{
int i, j;
int orr = curr, orc = curc;
for (i = 0; i < 8; i++)
{
for (j = 1; j < curWord.length(); j++)
{
int nexr = curr + dr[i], nexc = curc + dc[i];
if (inMap(nexr, nexc) && str[nexr][nexc] == curWord[j])
{
curr = nexr;
curc = nexc;
}
else
break;
}
if (j == curWord.length())
{
found = true;
break;
}
curr = orr, curc = orc;
}
}
void inputwork()
{
cin >> m >> n;
for (int i = 0; i < m; i++)
cin >> str[i];
cin >> wordnum;
for (int i = 0; i < wordnum; i++)
cin >> words[i];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
str[i][j] = tolower(str[i][j]);
}
for (int i = 0; i < wordnum; i++)
{
for (int j = 0; j < words[i].length(); j++)
words[i][j] = tolower(words[i][j]);
}
}
int main()
{
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
int kasenum;
cin >> kasenum;
while (kasenum--)
{
inputwork();
for (int k = 0; k < wordnum; k++)
{
wordlength = words[k].length();
memset(vis, false, sizeof(vis));
found = false;
curWord = words[k];
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (str[i][j] == words[k][0])
{
/*
memset(vis, false, sizeof(vis));
vis[i][j] = true;
dfs(1, i, j);
vis[i][j] = false;
*/
search(i, j);
}
if (found)
{
rr = i, rc = j;
break;
}
}
if (found)
break;
}
cout << rr + 1<< " " << rc+1 << endl;
}//for wordnum
if (kasenum != 0)
cout << endl;
}//while kasenum--
return 0;
}
相关文章推荐
- SOJ-3596 Article Decryption(字典树)
- Java三大框架之struts的上传文件出错信息配置(允许上传的类型,上传文件的大小,以及大文件上传说明等等)
- python中整形对象存储位置
- 艰难的起步
- 为什么KMP算法的预处理时间是Θ(m)?
- 使用WM_PASTE 和 WM_CHAR 消息时中文乱码总结
- 【Java源码分析】LinkedHashMap源码分析
- unity3d 第十二天
- MariaDB10.2.X-新特性2-支持check约束and with as
- .net 中生成二维码的组件
- Mysql数据库的SQL语句
- 使用两个栈实现一个队列
- Cannot find `include file "timescale.v" in directories
- ---Jsp(四)page指令
- hdu 5700 区间交 (线段树+枚举)
- 41.Oracle深度学习笔记——shared_pool底层知识大集合
- 初始JSP表达式语言-EL
- 05_更新数据
- Handler的postDelayed方法
- Android的消息机制