P1101 单词方阵 - 洛谷
题目描述
给一个 n×n 的字母方阵,内可能蕴含多个 yizhong 单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 *
代替,以突出显示单词。
输入格式
第一行输入一个数 n。(7 ≤ n ≤ 100)。
第二行开始输入 n×n 的字母矩阵。
输出格式
突出显示单词的 n×n 矩阵。
输入输出样例
输入 #1
markdown
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出 #1
markdown
********
********
********
********
********
********
********
输入 #2
markdown
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hghrwth
iwdfgng
yyyyggg
输出 #2
markdown
*yizhong
GYi*****
n********
o********
h********
z********
i********
y********
思路:
就是暴力,对任意一个点进行八个方向的暴力搜七个字符
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int dx[] = {0, 1, 1, 1, 0, -1, -1, -1};
int dy[] = {1, 1, 0, -1, -1, -1, 0, 1};
char mp[301][301];
bool word[301][301];
string s = "yizhong"; // 0~6下标
int n;
void dfs(int x, int y)
{
for(int i = 0; i < 8; i++)
{ // 八个方向的搜索
int dicx = dx[i]; // 当前方向记录下来
int dicy = dy[i];
int cnt = 0;
int tx = x;//用tx,ty继承参数
int ty = y;
bool valid = true;
for(int k = 0; k < 7; k++) //对一个方向搜七个字符
{ // 检查7个字符
if(tx < 1 || tx > n || ty < 1 || ty > n || mp[tx][ty] != s[k])//如果有一个为真那么不成立,直接break
{
valid = false;
break;
}
tx += dicx;
ty += dicy;
}
if(valid)
{ // 如果这个方向有效
tx = x;
ty = y;
for(int k = 0; k < 7; k++)
{
word[tx][ty] = true;
tx += dicx;
ty += dicy;
}
}
}
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
cin >> mp[i][j];
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (mp[i][j] == 'y') //如果符合第一个
{
dfs(i, j);
}
}
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
if (word[i][j])
cout << mp[i][j];
else
cout << '*';
}
cout << endl;
}
return 0;
}
’