题目描述
给一n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入格式
第一行输入一个数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<bits/stdc++.h>//Talk is cheap. Show me the code.
using namespace std;
char a[100][100];
int b[100][100] = {0};
int n;
int x[8] = { 0,1,0,-1,1,-1,1,-1 };
int y[8] = { 1,0,-1,0,-1,1,1,-1 };
string beginn = "yizhong";
class node
{
public:
int x, y;
}temp[7];
void print()
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
if (b[i][j] == 1)
cout << a[i][j];
else
cout << '*';
cout << endl;
}
}
void dfs(int ii, int jj, int d, int num)//位置、方向、第num位
{
if (num == 7)
for (int i = 0; i < 7; i++)
b[temp[i].x][temp[i].y] = 1;
else
if (a[ii][jj] == beginn[num])
{
temp[num].x = ii;
temp[num].y = jj;
dfs(ii + x[d], jj + y[d], d, num+1);
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin >> a[i][j];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
if (a[i][j] == 'y')
for (int z = 0; z < 8; z++)
dfs(i, j, z, 0);
print();
return 0;
}
来源:CSDN
作者:ccql
链接:https://blog.csdn.net/qq_43510916/article/details/104060788