P1101 单词方阵
P1101 单词方阵
题目描述
给一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矩阵。
输入输出样例
输入
7 aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa aaaaaaa
输出
******* ******* ******* ******* ******* ******* *******
输入
8 qyizhong gydthkjy nwidghji orbzsfgz hhgrhwth zzzzzozo iwdfrgng yyyygggg
输出
*yizhong gy****** n*i***** o**z**** h***h*** z****o** i*****n* y******g
解题思路:
1.首先用一个map数组保存输入的字母矩阵,然后用一个同样大小vis数组用来记录单词“yizhong”所在的位置。
2.首先遍历字母矩阵,先找到字母“y”所在的位置,然后遍历8个方向寻找是否有字母“i”。
3.如果存在字母“i”,沿着字母“i”所在的方向进行搜索,直到7个字母都存在为止。
#include<iostream>
#include<string>
using namespace std;
string word = "yizhong";
char map[110][110];
int vis[110][110] = { 0 };
int x[8] = { 1,0,1,-1,0,-1,1,-1 }, y[8] = { 0,1,1,0,-1,-1,-1,1 };//8个方向
void dfs(int px, int py, int k, int cnt) //分别代表当前点的坐标x,y,以及方向k,以及当前第几个点now
{
if (cnt == 6) //表示走到头了
{
for (int i = 0; i < 7; i++)
{
vis[px - i*x[k]][py - i*y[k]] = 1;
}
}
else {
if (map[px + x[k]][py + y[k]] == word[cnt + 1])
{
dfs(px + x[k], py + y[k], k, cnt + 1);
}
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> map[i];
}
for(int i= 0;i<n;i++)
for (int j = 0; j < n; j++)
{
if (map[i][j] == 'y') //出现y才开始四周寻找
{
for (int k = 0; k < 8; k++)
{
if (map[i + x[k]][j + y[k]] == 'i')
dfs(i + x[k], j + y[k], k, 1);
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
if (vis[i][j])
cout << map[i][j];
else cout << "*";
}
cout << endl;
}
return 0;
}

浙公网安备 33010602011771号