题目概况
题目链接: https://www.luogu.com.cn/problem/P1101 难度: 普及-
题目分析
简化题目: 我觉得题面简洁明了 涉及知识点: 深度优先搜索的玄学操作 解题思路 : 有几句关键句,我解析一下,大家就基本出思路了: 1. 同一单词摆放时不再改变方向 。也就是说我们不必考虑在dfs 中for 循环八个方向,只需要在一开始设定好即可 2. 单词与单词之间可以交叉,因此有可能共用字母 换句话说,你最开始必须得八个方向都探一遍,不能探完一个方向就走人 另外,我采用如果当前递归到的某个字符能与前后构成一个单词,则将前后包括自己全部标记为true ,在输出时输出非true的方格。
代码拆解及要点解析
普及-大可不必写拆解分析
完整代码
#include <iostream>
#include <cstdio>
using namespace std;
int n;
char maze[105][105];
bool vis[105][105];
char link[10];
int dir[8][2] = {{0,-1}, {0,1}, {1,0}, {-1,0}, {-1,1}, {-1,-1}, {1,-1}, {1,1}};
bool in(int xx, int yy) {
return xx >= 1 && xx <= n && yy >= 1 && yy <= n;
}
bool dfs(int x, int y, char now, int nowdir) {
if (now == 'g') {
vis[x][y] = true;
return true;
}
int tx = x + dir[nowdir][0];
int ty = y + dir[nowdir][1];
if (in(tx, ty)) {
if (maze[tx][ty] == link[now]) {
if (dfs(tx, ty, link[now], nowdir)) {
vis[x][y] = true;
return true;
}
}
}
return false;
}
int main() {
link['y'] = 'i';
link['i'] = 'z';
link['z'] = 'h';
link['h'] = 'o';
link['o'] = 'n';
link['n'] = 'g';
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
cin >> maze[i][j];
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (maze[i][j] == 'y') {
for (int k = 0; k < 8; k++) {
if (dfs(i, j, 'y', k)) {
vis[i][j] = true;
}
}
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (vis[i][j]) {
cout << maze[i][j];
} else {
cout << '*';
}
}
cout << endl;
}
return 0;
}
|