题目描述
给一 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: 复制
******* ******* ******* ******* ******* ******* *******
其实我觉得这题暴力遍历就好了,不过那样写太长,就根据大佬的思路写了一边
#include<bits/stdc++.h>
using namespace std;
int n,use[101][101];
int next[8][2]={{1,1},{1,0},{0,1},{1,-1},{-1,1},{0,-1},{-1,0},{-1,-1}};
string table = "izhong";
char c[101][101] = {'*'};
void ranse(int x, int y, int step, int r){
if(step >= 7)return;
use[x][y] = 1;
int dx = x-next[r][0];
int dy = y-next[r][1];
ranse(dx,dy,step+1,r);
}
void dfs(int x, int y, int step, int r){
if(x<0||y<0||x>n||y>n)return;
if(step >= 6){
ranse(x,y,0,r);
return;
}
int dx,dy;
dx = x + next[r][0];
dy = y + next[r][1];
if(c[dx][dy] != table[step])return;
dfs(dx,dy,step+1,r);
}
int main() {
cin >> n;
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
cin >> c[i][j];
}
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
if(c[i][j] == 'y'){
for(int k = 0; k < 8; k ++)
dfs(i,j,0,k);
}
}
}
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
if(use[i][j] == 1)
cout << c[i][j];
else
cout << '*';
}
cout << endl;
}
return 0;
}