深度优先搜索——单词方阵(洛谷 P1101)
题目选自洛谷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)相关推荐
- 深度优先搜索——选数(洛谷 P1036)
今天的题是一道深度优先搜索的题 题目链接 选自洛谷(P1036) 是一道很经典的DFS问题 首先我们先看一下题目是怎么描述的,读完题目我会在后面给出详细的思路! 题目描述 已知 nn 个整数 x_1, ...
- 深度优先搜索——First Step(洛谷 P3654)
题目选自洛谷P3654 本题遍历每一个可以站人的点,然后利用dfs的思路判断每一个点向下和向右是否能满足条件:但是k=1时需要特判,因为k=1意味着向下和向右重复计算,需要除以2. 注意在dfs前先判 ...
- 洛谷P1101、P1019
洛谷P1101 happy 2020年A的第一道题~(- ̄▽ ̄)- 题目大意:在一个二维字符数组中找到所有的连续'yizhong'的字符(各个方向),然后将其他的地方都用'*'替换掉. 解题思路:最开 ...
- 深度优先搜索——单词接龙(洛谷 P1019)
题目选自洛谷P1019 首先在题意上可能有些误解. 两个单词合并时,合并部分取的是最小重叠部分 相邻的两部分不能存在包含关系就是说如果存在包含关系,就不能标记为使用过. 每个单词最多出现两次. (其实 ...
- 枚举求解单词方阵(洛谷P1101题题解,Java语言描述)
题目要求 P1101题目链接 分析 可以用DFS做,但我立下了个Flag,所以就用了朴素的枚举来做.... 结果,我的天哪,做了好几个小时-- 其实这种地图题,真的适合 DFS or BFS or D ...
- 洛谷P1101 单词方阵 (C语言 + 详细注释 + 五妙)
//首先声明一下,我的代码大部分是参照洛谷的一位博客:Way_How_Fri3nd.看完后我就觉得写的非常好,由于我不知道怎么转载洛谷的博客,所以干脆自己写一篇CSDN博客,因为写的实在是太好了,我迫 ...
- c语言倒序输出单词_洛谷 || 单词覆盖还原(C语言)
点击上方「蓝字」关注"程序员Bob" 每天与你不见不散! 每日一句,送给最珍贵的你: 诱人的机会总是转瞬即逝的.真正好的投资机会不会经常有,也不会持续很长的时间,所以你必须做好行动 ...
- 洛谷——P1101 单词方阵
题目描述 给一n \times nn×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着 88 个方向的任一方向,同一单词摆放时不 ...
- 单词方阵(洛谷-P1101)
题目描述 给一nXn的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间 ...
最新文章
- Vista下将目录的所有者恢复为 TrustedInstaller 的方法
- linux 磁盘查看sbli,Linux磁盘配额应用
- 北京大学孙俊教授课题组深度视频研究室招收2021级博士生
- boost::units::information相关的测试程序
- 洗礼灵魂,修炼python(54)--爬虫篇—urllib2模块
- 廖雪峰说python_廖雪峰官网Python部分的疑问及解决
- python实现决策树算法sklearn_python sklearn-05:决策树及随机森林
- java math round小数_Java——Math的round方法
- 跑分cpu_一加8T现身跑分网站:CPU正式敲定 10月15日见
- CentOS 7 怎样安装或升级最新的内核?
- python装第三方库有几种方法_Python安装第三方库的4种方法
- C++STL查找,lower_bound()函数和upper_bound()函数的区别
- 2019“我爱北京——市民新春联欢会”将现300人大合唱
- That's why you go away
- 分析PS中的3D功能
- kali wifi不可用_Kali Linux系统解决无线网卡无法连接WIFI模块教程:
- 软件设计师-1.计算机系统知识
- java-堆里面的分区:Eden,survival(from) to,老年代,各自的特点。
- 170907 WarGames-Behemoth(5-6)
- 名悦集团:汽车冬季保养小知识
热门文章
- ubuntu tftp 服务器故障排除一例
- 仿OUTLOOK2007 多样化摺叠菜单
- 怎么用到自动化办公中_房型太小没有办公区怎么办?客厅中的1㎡就能搞定
- Spring JDBC事务支持类jdbcTemplate(了解)
- python 行为驱动_什么是行为驱动的Python?
- 前端:CSS/12/display属性,overflow属性,cursor光标类型,CSS定位,综合案例:今日闪价
- html5 canvas气泡动画
- 深度学习笔记(47) 神经风格迁移
- java channelpipeline,Netty那点事(三)Channel与Pipeline
- mui + php,GitHub - alphaphp/mui-kidApp: 基于 MUI 构建一个具有 90 +页面的APP应用