单词方阵(C语言)

题目

题目描述

给一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;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值