题目
题目描述
给一n×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≤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
题解
1.首先明确,这个题目要用DFS,我一开始是找指定字符串的任意字符作标准,但是后来发现这样找字符的位置信息处理很麻烦,于是决定在输入的字符数组找到指定字符串的首字符。
2.4个数组,标记数组,输入字符数组,指定字符串数组,方向数组(八个方向)。
3.怎么判断在特定方向上的字符串是否有指定字符串。
(1)对于方向的处理,找到是指定字符串的首字符的字符的位置,让它向八个方向的每个方向都延伸。
(2)字符位置不断在指定方向上移动,用一个for循环判断一下指定字符串上的字符是否与相应的移动字符的值是否相等,一旦不相等就跳出DFS,那么留在最后的就是输入数组中的指定字符串。
用遍历将DFS中路过的所有字符位置标记改变。
4.关于字符串的输入,我一直输入错误,后来发现输入时应该一行一行的输(scanf("%c",x[i]))。
代码如下
#include"stdio.h"
#include"string.h"
int n;
char s[101][101];
char a[8]={"yizhong"};
int book[101][101]={0};
int fx[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
void dfs(int x,int y,int l)//位置,方向
{
int i,xx=x,yy=y;
for(i=0;i<7;i++)
{
if(s[x][y]!=a[i])
{
return;
}
x+=fx[l][0];
y+=fx[l][1];
}//如果在这个方向字符一但有不是a字符串中的字符就跳出,循环结束后x,y值改变了
for(i=0;i<7;i++)
{
book[xx][yy]=1;
xx+=fx[l][0];
yy+=fx[l][1];
}
}
int main()
{
int i,j,k;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++)
{
scanf("%s",s[i]);
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(s[i][j]==a[0])//是否是第一个字符
{
for(k=0;k<8;k++)
{dfs(i,j,k);}//八个方向都判断
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(book[i][j]!=1)
s[i][j]='*';
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%c",s[i][j]);
}
printf("\n");
}
return 0;
}