题目描述
给 n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:
输入 | 输出 |
---|---|
8 qyizhong gydthkjy nwidghji orbzsfgz hhgrhwth zzzzzozo iwdfrgng yyyygggg | * yizhong gy****** n* i***** o** z**** h* ** h*** z**** o** i ***** n* 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
解析
让我彻底放弃了string的题目
搜索典型题目,先找,找到’y’或’g’,然后向左,向下,向左下,向右下四种方向查找,如果找到了整个字符串,则把它复制到t字符串内.
之所以不往回找是因为之前的位置已经查过了,不用重复查找.
emmm,之所以写的这么长,不是因为我懒得简化了,绝对不是
#include<iostream>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<stdio.h>
#include<stdlib.h>
#include<map>
#ifndef NULL
#define NULL 0
#endif
using namespace std;
class vec {
public:
int ix, iy;
}cur[7];
int n,dx[] = { 1,0,1,-1 }, dy[] = { 0,1,1,1 };
char s[110][110] ,t[110][110] ,s1[7] = {'y','i','z','h','o','n','g'};
void dfs(int x, int y, int deep, int p, bool f)
{
if (deep == 7) {
for (int i = 0; i < deep; i++)
if (f)
t[cur[i].ix][cur[i].iy] = s1[i];
else
t[cur[i].ix][cur[i].iy] = s1[deep - i-1];
}
x += dx[p], y += dy[p];
if(x>=0&&x<n&&y>=0&&y<n)
if(f&&s[x][y] == s1[deep]){
cur[deep].ix = x, cur[deep].iy = y;
dfs(x, y, deep + 1, p, f);
cur[deep].ix = 0, cur[deep].iy = 0;
}
else if (s[x][y] == s1[6 - deep] && !f) {
cur[deep].ix = x, cur[deep].iy = y;
dfs(x, y, deep + 1, p, f);
cur[deep].ix = 0, cur[deep].iy = 0;
}
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> s[i];
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
if (s[i][j] == 'y') {
cur[0].ix = i, cur[0].iy = j;
for (int k = 0; k < 4; k++)
dfs(i, j, 1, k, 1);
cur[0].ix = 0, cur[0].iy = 0;
}
else if (s[i][j] == 'g') {
cur[0].ix = i, cur[0].iy = j;
for (int k = 0; k < 4; k++)
dfs(i, j, 1, k, 0);
cur[0].ix = 0, cur[0].iy = 0;
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++)
if (t[i][j] == 0)
cout << '*';
else
cout << t[i][j];
cout << endl;
}
return 0;
}