P1101 单词方阵题解

题目传送门

理解与感悟

1、方向数组的使用

2、路径数组的使用
假如没有路径数组,就不好记录行走的过程,最终走到了终点,也不需要哪些点走过,没法重头描述路径。

带路径的dfs

#include <bits/stdc++.h>

using namespace std;
const int N = 110;
char a[N][N];
int b[N][N];//标识数组中i,j位置的字符是不是需要显示出原本的内容,还是显示星星
int n;

//8个方向
int dx[8] = {0, 0, -1, 1, -1, 1, -1, 1}; //上下左右
int dy[8] = {1, -1, 0, 0, 1, 1, -1, -1}; //左下,右下,左上,右上

//坐标结构体
struct coord {
    int x, y;
};
//目标串
string s = "yizhong";

//这条路线上是怎么记录所有点的
vector<coord> path;

//深搜
//x,y:坐标
//step:准备查找第几个字符
//dir:哪个方向
void dfs(int x, int y, int step, int dir) {
    //找到所有的字符,表示成功,需要输出
    if (step == s.size()) {
        //修改此路径中所有位置内容需要显示
        for (auto p :path) b[p.x][p.y] = 1;
        return;
    }
    //下一个位置
    int x1 = x + dx[dir], y1 = y + dy[dir];
    //如果不出界,并且下一个字符与目标字符相等
    if (x1 >= 1 && x1 <= n && y1 >= 1 && y1 <= n && s[step] == a[x1][y1]) {
        //加入路径中
        path.push_back({x1, y1});
        //继续探索
        dfs(x1, y1, step + 1, dir);
    }
}

int main() {
    //输入
    cin >> n;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            cin >> a[i][j];
    //开始深搜
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= n; j++)
            if (a[i][j] == s[0]) { //找出所有可能的出发点
                //8个方向都要派出侦查兵
                for (int dir = 0; dir < 8; dir++) {
                    //清空路径
                    path.clear();
                    //放入第一个起始点
                    path.push_back({i, j});
                    //深度搜索
                    dfs(i, j, 1, dir);//以i,j为第一个起点坐标,开始进行探索,这是第一个字符,dir代表方向
                }
            }

    //输出
    for (int i = 1; i <= n; ++i) {
        for (int j = 1; j <= n; ++j)
            if (b[i][j])cout << a[i][j]; else cout << "*";
        cout << endl;
    }
    return 0;
}
posted @ 2021-07-28 10:56  糖豆爸爸  阅读(51)  评论(0编辑  收藏  举报
Live2D