复制Markdown 展开
题目描述
给一 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
#include <cstdio> #include <iostream> using namespace std; const int N = 110; int n; char g[N][N]; bool st[N][N]; string last = "yizhong"; int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0}; int dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1}; bool dfs(int x, int y, int sx, int sy, int next) { if (next >= 7) return true; int a = x + sx, b = y + sy; if (g[a][b] == last[next])//若当前的字母与需要的字母相等 { if (dfs(a, b, sx, sy, next + 1))//则按这个方向枚举下一个字母 { st[a][b] = true; return true; } } return false; } int main() { cin >> n; for (int i = 0; i < n; i ++ ) scanf("%s", g[i]); for (int i = 0; i < n; i ++ ) for (int j = 0; j < n; j ++ ) if (g[i][j] == 'y') for (int k = 0; k < 8; k ++ ) if (dfs(i, j, dx[k], dy[k], 1))//注意题目要求只能一条路走到黑, st[i][j] = true; //不能拐弯,所以要枚举确定的方向 for (int i = 0; i < n; i ++ ) { for (int j = 0; j < n; j ++ ) if (st[i][j]) cout << g[i][j]; else cout << "*"; puts(""); } return 0; }