题目描述
给一n \times nn×n的字母方阵,内可能蕴含多个“yizhong
”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 88个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*
代替,以突出显示单词。例如:
输入: 输出:
8
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式
输入格式:
第一行输入一个数nn。(7 \le n \le 1007≤n≤100)。
第二行开始输入n \times nn×n的字母矩阵。
输出格式:
突出显示单词的n \times nn×n矩阵。
输入输出样例
输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:
*******
*******
*******
*******
*******
*******
*******
输入样例#2:
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
输出样例#2:
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
题解
对方阵中的每一个元素进行搜索,搜索此元素的八个方向上是否能连成单词“yizhong”,这里需要注意搜索一个方向时不能拐弯,所以要确立方向。将方向作为dfs的参数之一。
#include <iostream>
#include <string>
using namespace std;
string s[101], k = "yizhong";
int n, g[101][101] = { 0 };
void dfs(int x, int y, int t, string h, int f) {
if (t == k.size() && h == k) { //如果连成,就把用到过的字符标记为1
if (f == 1) {
for (int i = 0; i < t; i++) {
g[x][y - 1 - i] = 1;
}
}
else if (f == 2) {
for (int i = 0; i < t; i++) {
g[x - 1 - i][y - 1 - i] = 1;
}
}
else if (f == 3) {
for (int i = 0; i < t; i++) {
g[x - 1 - i][y] = 1;
}
}
else if (f == 4) {
for (int i = 0; i < t; i++) {
g[x - 1 - i][y + 1 + i] = 1;
}
}
else if (f == 5) {
for (int i = 0; i < t; i++) {
g[x][y + 1 + i] = 1;
}
}
else if (f == 6) {
for (int i = 0; i < t; i++) {
g[x + 1 + i][y + 1 + i] = 1;
}
}
else if (f == 7) {
for (int i = 0; i < t; i++) {
g[x + 1 + i][y] = 1;
}
}
else if (f == 8) {
for (int i = 0; i < t; i++) {
g[x + 1 + i][y - 1 - i] = 1;
}
}
}
else if (x < 0 || x >= n || y < 0 || y >= n) return; //判断越界,如果越界就不继续向前搜索
else if (t == 0) { //如果为第一次判断,向八个方向搜索
dfs(x, y + 1, t + 1, h, 1);
dfs(x + 1, y + 1, t + 1, h, 2);
dfs(x + 1, y, t + 1, h, 3);
dfs(x + 1, y - 1, t + 1, h, 4);
dfs(x, y - 1, t + 1, h, 5);
dfs(x - 1, y - 1, t + 1, h, 6);
dfs(x - 1, y, t + 1, h, 7);
dfs(x - 1, y + 1, t + 1, h, 8);
}
else { //向前搜索
if (f == 1 && s[x][y] == k[t]) {
dfs(x, y + 1, t + 1, h + k[t], 1);
}
else if (f == 2 && s[x][y] == k[t]) {
dfs(x + 1, y + 1, t + 1, h + k[t], 2);
}
else if (f == 3 && s[x][y] == k[t]) {
dfs(x + 1, y, t + 1, h + k[t], 3);
}
else if (f == 4 && s[x][y] == k[t]) {
dfs(x + 1, y - 1, t + 1, h + k[t], 4);
}
else if (f == 5 && s[x][y] == k[t]) {
dfs(x, y - 1, t + 1, h + k[t], 5);
}
else if (f == 6 && s[x][y] == k[t]) {
dfs(x - 1, y - 1, t + 1, h + k[t], 6);
}
else if (f == 7 && s[x][y] == k[t]) {
dfs(x - 1, y, t + 1, h + k[t], 7);
}
else if (f == 8 && s[x][y] == k[t]) {
dfs(x - 1, y + 1, t + 1, h + k[t], 8);
}
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) cin >> s[i];
for (int i = 0; i < n; i++) //每一个字符做起点搜索
for (int j = 0; j < n; j++) {
string l = "0";
l[0] = s[i][j];
dfs(i, j, 0, l, 0);
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (g[i][j] == 0) {
cout << "*";
}
else {
cout << s[i][j];
}
}
cout << endl;
}
return 0;
}