解题思路:
(1)本题更加符合方向数组类型,只是简单的利用一下搜索的思路,根据题意,要求将单词“yizhong”所在的位置的字符输出出来,其他都是输出*号
(2)那么可以设置一个地图数组a,和一个标记数组vis,用来标记这个位置输出字符还是*号,那么什么时候开始搜索判断呢?当然是找到第一个字符y的时候开始搜索
(3)可以从该点的八个方向,依次进行搜索,所以需要设置一个行列的方向数组偏移量,然后判断一下,沿着该方向到底有没有这个单词。
(4)如何判断剩余位置的字符是不是和这个单词的字符一一对应呢,我们可以把方向数组的偏移量依次*整数倍,然后初始化一个字符数组专门放单词。如果中间发生了越界,或者有字符不相等,那么在这个方向上,便没有这个单词,继续判断下一个方向
(5)如果出现了这个单词,那么就将这隔单词中每个字符的位置都标记为1,(方便输出)
(6)所以这道题代码不难,因为方向确定好了,那么再想想,如果可以不是一个方向上连续组成的单词,那么应该如何搜索呢?
- #include
- using namespace std;
-
- int n;
- char a[110][110];//字符地图
- char b[15]={'y','i','z','h','o','n','g'};//寻找的单词
- bool vis[110][110];//标记哪些字符输出
- int dx[10]={-1,1,0,0,-1,-1,1,1};//表示行号的方向数组
- int dy[10]={0,0,-1,1,-1,1,1,-1};//表示列号的方向数组
-
- void dfs(int x,int y)
- {
- for(int i=0;i<=7;i++)
- {
- bool flag=1;//打标记,判断该方向是否有这个单词
- for(int j=1;j<=6;j++)//将剩余的单词一一比较
- {
- int xx=x+dx[i]*j;//形成新的行号
- int yy=y+dy[i]*j;//形成新的列号
-
- if(xx>n||xx<1||yy>n||yy<1)//如果有越界的话
- {
- flag=0;
- break;//结束循环
- }
-
- if(a[xx][yy]!=b[j])//如果有字符不等的话
- {
- flag=0;
- break;//退出循环
- }
- }
-
- if(flag==1)//如果该方向上有这个单词
- {
- for(int j=0;j<=6;j++)//将这七个单词的位置全部赋值为1
- {
- int xx=x+dx[i]*j;
- int yy=y+dy[i]*j;
- vis[xx][yy]=1;
- }
- }
- }
- }
- int main()
- {
- cin>>n;
- for(int i=1;i<=n;i++)
- for(int j=1;j<=n;j++)
- cin>>a[i][j];//输入字符地图
-
- for(int i=1;i<=n;i++)//遍历每个字符
- {
- for(int j=1;j<=n;j++)
- {
- if(a[i][j]=='y')//如果发现了是字符y
- {
- dfs(i,j);//开始搜索
- }
- }
- }
-
- for(int i=1;i<=n;i++)//打印字符
- {
- for(int j=1;j<=n;j++)
- {
- if(vis[i][j]==0)//如果标记是0的话
- cout<<"*";
- else//如果标记是1的话
-
-
相关阅读:
C#版字节跳动SDK - SKIT.FlurlHttpClient.ByteDance
844. 比较含退格的字符串
手把手基于YOLOv5定制实现FacePose之《YOLO结构解读、YOLO数据格式转换、YOLO过程修改》
RK3568 Android11 默认打开网络ADB
Spring源码分析之事物管理
Docker 安装redis
【浅学Java】三次握手 / 四次挥手
9.吴恩达深度学习--机器翻译
CocosCreater学习1
云计算 - 3 - 使用MapReduce处理数据
-
原文地址:https://blog.csdn.net/weixin_60869516/article/details/127431368