题目选自洛谷P1101

这道题也是挺不错的DFS的题,但是区别于一般的深搜,

这道题在选定一个方向后,就不能改变了!

给出我的详细思路就是:

用char a[101][101]保存输入的数据,int b[101][101]保存应该输出原字符还是"*"

用int nt[8][2]保存8个方向的 x,y坐标的改变值

用char p[7] = "yizhong" 来便于判断字符是否匹配

用int change[7][2] 保存需要原样数组的 7 个位置的x,y坐标

void print(){ }  是用来输出的,如果在b数组中 i j 位置值是1就输出a[i][j] 否则就输出"*"

void gaibian(){ } 顾名思义,用来对满足条件的7个坐标将其在b中的位置设置为1

void dfs(){ } 搜索的函数,不过我没有用递归来写,

这里我们首先将 a中字符为'y'的进行dfs遍历,

所以待改变的第一个位置就是x,y;

然后遍历8个方向,每个方向由第一层循环确定,这就是题目要求的方向不改变,

(但是记得每个方向完成之后都将nx,ny的初始值置为 x,y,不然就只遍历完一个方向就完事了)

第二次循环我们遍历6次(因为从y开始的,还需要确定6个字符),

每次都得到新的nx,ny的值并且判断是否满足正在判断的第几个字符(我们用ans来记录判断第几个字符了),如果下标没有越界,并且和p[ans]字符相等,那就接着再判断下一个,直到判断了7个都满足(ans==7),那么就调用gaibian()函数将其在b中的值改变,

如果中途某一个就不满足了,那直接跳出第二层循环,进行第一层循环的下一个方向。

题目描述

给一n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着 8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用*代替,以突出显示单词。例如:

输入:8                     输出:qyizhong              *yizhonggydthkjy              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 矩阵。

输入输出样例

输入 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

解题代码:

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int n;
char a[101][101],b[101][101];
int nt[8][2] = {{0,1},{1,1},{1,0},{1,-1},{0,-1},{-1,-1},{-1,0},{-1,1}};
char p[7] = {'y','i','z','h','o','n','g'};
int change[7][2]; //用来改变7个位置的值
void print(){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(b[i][j])cout<<a[i][j];else cout<<"*";}cout<<endl;}
}
void gaibian(){for(int i=0;i<7;i++)b[change[i][0]][change[i][1]] = 1;
}
void dfs(int x,int y){  //坐标为x y 的值是不是为第 z 个change[0][0] = x; change[0][1] = y; //先将y保存到待改变的坐标中for(int i=0;i<8;i++){ //8个方向int nx=x,ny=y;int ans = 1;for(int j=1;j<7;j++){  //遍历6个字母nx=nx+nt[i][0]; ny=ny+nt[i][1];if(nx>0&&nx<=n && ny>0&&ny<=n && a[nx][ny] == p[j]){  //如果这个方向字母满足ans++; change[j][0]=nx; change[j][1]=ny;}else break; //否则的话 换一个方向遍历}if(ans==7) gaibian();}
}
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') dfs(i,j);print();return 0;
}

深度优先搜索——单词方阵(洛谷 P1101)相关推荐

  1. 深度优先搜索——选数(洛谷 P1036)

    今天的题是一道深度优先搜索的题 题目链接 选自洛谷(P1036) 是一道很经典的DFS问题 首先我们先看一下题目是怎么描述的,读完题目我会在后面给出详细的思路! 题目描述 已知 nn 个整数 x_1, ...

  2. 深度优先搜索——First Step(洛谷 P3654)

    题目选自洛谷P3654 本题遍历每一个可以站人的点,然后利用dfs的思路判断每一个点向下和向右是否能满足条件:但是k=1时需要特判,因为k=1意味着向下和向右重复计算,需要除以2. 注意在dfs前先判 ...

  3. 洛谷P1101、P1019

    洛谷P1101 happy 2020年A的第一道题~(- ̄▽ ̄)- 题目大意:在一个二维字符数组中找到所有的连续'yizhong'的字符(各个方向),然后将其他的地方都用'*'替换掉. 解题思路:最开 ...

  4. 深度优先搜索——单词接龙(洛谷 P1019)

    题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...

  5. 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)

    题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...

  6. 洛谷P1101 单词方阵 (C语言 + 详细注释 + 五妙)

    //首先声明一下,我的代码大部分是参照洛谷的一位博客:Way_How_Fri3nd.看完后我就觉得写的非常好,由于我不知道怎么转载洛谷的博客,所以干脆自己写一篇CSDN博客,因为写的实在是太好了,我迫 ...

  7. c语言倒序输出单词_洛谷 || 单词覆盖还原(C语言)

    点击上方「蓝字」关注"程序员Bob" 每天与你不见不散! 每日一句,送给最珍贵的你: 诱人的机会总是转瞬即逝的.真正好的投资机会不会经常有,也不会持续很长的时间,所以你必须做好行动 ...

  8. 洛谷——P1101 单词方阵

    题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放时不 ...

  9. 单词方阵(洛谷-P1101)

    题目描述 给一nXn的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间 ...

最新文章

  1. Vista下将目录的所有者恢复为 TrustedInstaller 的方法
  2. linux 磁盘查看sbli,Linux磁盘配额应用
  3. 北京大学孙俊教授课题组深度视频研究室招收2021级博士生
  4. boost::units::information相关的测试程序
  5. 洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块
  6. 廖雪峰说python_廖雪峰官网Python部分的疑问及解决
  7. python实现决策树算法sklearn_python sklearn-05:决策树及随机森林
  8. java math round小数_Java——Math的round方法
  9. 跑分cpu_一加8T现身跑分网站:CPU正式敲定 10月15日见
  10. CentOS 7 怎样安装或升级最新的内核?
  11. python装第三方库有几种方法_Python安装第三方库的4种方法
  12. C++STL查找,lower_bound()函数和upper_bound()函数的区别
  13. 2019“我爱北京——市民新春联欢会”将现300人大合唱
  14. That's why you go away
  15. 分析PS中的3D功能
  16. kali wifi不可用_Kali Linux系统解决无线网卡无法连接WIFI模块教程:
  17. 软件设计师-1.计算机系统知识
  18. java-堆里面的分区:Eden,survival(from) to,老年代,各自的特点。
  19. 170907 WarGames-Behemoth(5-6)
  20. 名悦集团:汽车冬季保养小知识

热门文章

  1. ubuntu tftp 服务器故障排除一例
  2. 仿OUTLOOK2007 多样化摺叠菜单
  3. 怎么用到自动化办公中_房型太小没有办公区怎么办?客厅中的1㎡就能搞定
  4. Spring JDBC事务支持类jdbcTemplate(了解)
  5. python 行为驱动_什么是行为驱动的Python?
  6. 前端:CSS/12/display属性,overflow属性,cursor光标类型,CSS定位,综合案例:今日闪价
  7. html5 canvas气泡动画
  8. 深度学习笔记(47) 神经风格迁移
  9. java channelpipeline,Netty那点事(三)Channel与Pipeline
  10. mui + php,GitHub - alphaphp/mui-kidApp: 基于 MUI 构建一个具有 90 +页面的APP应用