洛谷 单词方阵 dfs
题目描述
给一 n×n 的字母方阵,内可能蕴含多个 yizhong
单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 *
代替,以突出显示单词。
输入格式
第一行输入一个数 n。(7≤n≤100)。
第二行开始输入 n×n 的字母矩阵。
输出格式
突出显示单词的 n×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
代码:
#include <iostream>
#include <cstring>
#include <vector>
#include <string>
#include <algorithm>
#define MX 105
using namespace std;
//全局变量
int n;
char ch[MX][MX];
int dx[8] = {0,0,1,-1,1,1,-1,-1},dy[8] = {1,-1,0,0,1,-1,1,-1};
string s = "yizhong";
int flag = 0,visited[MX][MX];
//深度优先搜索
void dfs(int x,int y,int dir,int forward) {
//cout<<x<<" "<<y<<" "<<dir<<" "<<forward<<endl;
if(ch[x][y] == 'g') {
flag = 1;
visited[x][y] = 1;
return;
}
int tx = x + dx[dir],ty = y + dy[dir];
if(ch[tx][ty] == s[forward+1]) {
dfs(tx,ty,dir,forward+1);
}
if(flag == 1) {
visited[x][y] = 1;
}
return;
}
int main() {
cin>>n;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
cin>>ch[i][j];
//cout<<ch[i][j];
}
//cout<<endl;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
//cout<<1<<" "<<i<<" "<<j<<endl;
if(ch[i][j] == 'y') {
for(int k = 0; k < 8; k++) {
flag = 0;
dfs(i,j,k,0);
}
}
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
if(visited[i][j] == 1)cout<<ch[i][j];
else cout<<"*";
}
cout<<endl;
}
return 0;
}