题目链接
链接: P1101 单词方阵
题目描述
解题思路
这段代码的目标是在给定的字符方阵中寻找特定单词 “yizhong”,并将找到的单词输出。
代码的解题思路是使用深度优先搜索(DFS)来进行搜索。首先,遍历字符方阵中的每一个位置,如果当前位置的字符为 ‘y’,则以该位置为起始点,分别沿着八个方向进行搜索。搜索过程中,根据当前位置的字符是否与目标单词 “yizhong” 的下一个字符匹配,进行递归搜索。当递归的深度达到 7 时,表示找到了完整的单词,此时标记相应的路径。最终输出标记数组,将找到的单词输出,未找到的位置用 “*” 表示。
if (isValid(newX, newY) && a[newX][newY] == "yizhong"[pos]) {
dfs(newX, newY, pos + 1, dir);
}
附注:上述代码中使用的 “yizhong”[pos] 是针对单个字符的比较,它的效果等同于 ‘yizhong’[pos]。而使用双引号 “yizhong” 是表示一个字符串。实际上,C++ 中的字符可以用单引号或双引号表示,但在比较单个字符时,建议使用单引号以避免歧义。
代码实现
#include <iostream>
#include <vector>
using namespace std;
const int N = 110;
char a[N][N];
bool visited[N][N];
int n;
// 8个方向数组
int dirX[] = {1, 1, 0, -1, -1, -1, 0, 1};
int dirY[] = {0, 1, 1, 1, 0, -1, -1, -1};
bool isValid(int x, int y) {
return x >= 0 && x < n && y >= 0 && y < n;
}
// 搜索函数
void dfs(int x, int y, int pos, int dir) {
if (pos == 7) { // 找到了完整的单词
for (int i = 0; i < 7; i++) {
visited[x - dirX[dir]*i][y - dirY[dir]*i] = true;
}
return;
}
int newX = x + dirX[dir];
int newY = y + dirY[dir];
if (isValid(newX, newY) && a[newX][newY] == "yizhong"[pos]) {
dfs(newX, newY, pos + 1, dir);
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
cin >> a[i][j];
}
}
// 遍历所有位置并进行搜索
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (a[i][j] == 'y') {
for (int k = 0; k < 8; k++) {
dfs(i, j, 1, k);
}
}
}
}
// 输出结果
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (visited[i][j]) {
cout << a[i][j];
} else {
cout << "*";
}
}
cout << endl;
}
return 0;
}
总结
当解决这个问题时,一种常见的思考过程如下:
-
理解题意和要求:首先需要弄清楚题目要求,在这个问题中,需要在给定的字符方阵中寻找特定单词 “yizhong”,并将找到的单词输出。通过理解题目要求,可以确定问题的目标和约束条件。
-
选择合适的算法:对于这个问题,由于需要在字符方阵中进行搜索,而且搜索方向是多样的,同时需要保持搜索路径的状态,因此可以考虑使用深度优先搜索(DFS)算法。DFS算法适用于在图或矩阵中搜索路径的问题,能够准确找到目标路径。
-
设计算法思路:在选择了DFS算法后,需要设计出基本的算法思路。首先,要在字符方阵中遍历每一个位置,对于每一个字符 ‘y’,都将其作为起始点,沿着八个方向进行DFS搜索。在DFS的过程中,需要判断当前位置是否为目标单词 “yizhong” 对应位置的字符,并且需要记录搜索的路径。
-
实现算法代码:将设计的算法思路转化为代码实现。包括设置合适的数据结构、编写DFS函数、在主函数中进行遍历和调用DFS函数等。
-
测试和调试:编写好代码后,需要进行测试,并注意检查是否有边界情况未考虑到,并对代码中的可能出现错误进行排查和调试。
-
分析复杂度和优化:分析算法的时间和空间复杂度,看是否有可能对算法进行优化。在这个问题中,深度优先搜索的时间复杂度为 O(n^2 * 8^7),其中 n 为字符方阵的边长。若需要进一步优化可以考虑剪枝等手段。