P1101 单词方阵 深度优先搜索


题目链接

链接: 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;
}

总结

当解决这个问题时,一种常见的思考过程如下:

  1. 理解题意和要求:首先需要弄清楚题目要求,在这个问题中,需要在给定的字符方阵中寻找特定单词 “yizhong”,并将找到的单词输出。通过理解题目要求,可以确定问题的目标和约束条件。

  2. 选择合适的算法:对于这个问题,由于需要在字符方阵中进行搜索,而且搜索方向是多样的,同时需要保持搜索路径的状态,因此可以考虑使用深度优先搜索(DFS)算法。DFS算法适用于在图或矩阵中搜索路径的问题,能够准确找到目标路径。

  3. 设计算法思路:在选择了DFS算法后,需要设计出基本的算法思路。首先,要在字符方阵中遍历每一个位置,对于每一个字符 ‘y’,都将其作为起始点,沿着八个方向进行DFS搜索。在DFS的过程中,需要判断当前位置是否为目标单词 “yizhong” 对应位置的字符,并且需要记录搜索的路径。

  4. 实现算法代码:将设计的算法思路转化为代码实现。包括设置合适的数据结构、编写DFS函数、在主函数中进行遍历和调用DFS函数等。

  5. 测试和调试:编写好代码后,需要进行测试,并注意检查是否有边界情况未考虑到,并对代码中的可能出现错误进行排查和调试。

  6. 分析复杂度和优化:分析算法的时间和空间复杂度,看是否有可能对算法进行优化。在这个问题中,深度优先搜索的时间复杂度为 O(n^2 * 8^7),其中 n 为字符方阵的边长。若需要进一步优化可以考虑剪枝等手段。

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值