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;
}