题目描述

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

输入输出格式

输入格式:

第一行输入一个数n。(7≤n≤100)。

第二行开始输入n×n的字母矩阵。

输出格式:

突出显示单词的n×n矩阵。

AC1(以当前所在位置为判断标准)

之前做的搜索,一维上默认就一个方向,二维上可以上下左右,其实就是任意方向,但是本题的方向只能是一条线上的。所以用上一篇走迷宫的搜索是走不通的

带搜索方向的dfs。方向作为参数传入dfs,可以使用数组提前存储对应方向,1-8散列到对应方向。最后如何保存轨迹呢?设置一个同等大小的二维字符串数组,注意字符数组的默认填充是空(\0),有结束的id(x,y)和方向,逆推就可以了。

结束条件:使用深度depth作为是否成功的标志,字符串yizhong的长度为7,这里设置如果深度为8则看做搜索成功。

搜索条件:如果当前索引没有越界且等于对应的字符,进行下一层的索引,缺点,因为y已经判断过了,所以这里又进行了一次判断 。如果直接对下一层进行判断会少一些操作,同时判断结束条件的depth应为7,对应的解法在AC2

#include<cstdio>
#include<cmath>
using namespace std;
int N;
char strs[101][101];
char ans[101][101];
//8个方向
int xs[8]={1,-1,0,0,1,-1,1,-1};
int ys[8]={0,0,1,-1,1,-1,-1,1};
//标识
char flag[9]=" yizhong";
int num = 0;
void dfs(int i,int j,int depth,int k){
//结束条件
if(depth==8){
for (int l = 7; l > 0; --l) {
i-=ys[k];
j-=xs[k];
ans[i][j]=strs[i][j];//从g开始
}
return;
}
if(i<0||j<0||i>N-1||j>N-1){
return;
}
char is = strs[i][j];
//判断是否为空,当前字符是否符合
if(flag[depth]==is)
dfs(i+ys[k],j+xs[k],depth+1,k);
}
int main() {
scanf("%d", &N);
int temp = 0;
while (temp < N) {
scanf("%s", &strs[temp++]);
}
for (int l = 0; l < N; ++l) {
for (int i = 0; i < N; ++i) {
ans[l][i]='*';
}
}
for (int i = 0; strs[i][0] !='\0'; ++i) {
for (int j = 0; strs[i][j] !='\0'; ++j) {
if(strs[i][j]=='y'){
dfs(i,j,1,0);
dfs(i,j,1,1);
dfs(i,j,1,2);
dfs(i,j,1,3);
dfs(i,j,1,4);
dfs(i,j,1,5);
dfs(i,j,1,6);
dfs(i,j,1,7);
}
}
}
for (int k = 0; k < N; ++k) {
printf("%s\n",ans[k]);
}
return 0;
}

AC2(以下一步为判断标准,更清晰)

#include<cstdio>
#include<cmath>
using namespace std;
int N;
char strs[101][101];
char ans[101][101];
//8个方向
int xs[8]={1,-1,0,0,1,-1,1,-1};
int ys[8]={0,0,1,-1,1,-1,-1,1};
//标识
char flag[9]=" yizhong";
void dfs(int i,int j,int depth,int k){
//结束条件
if(depth==7){
for (int l = 7; l > 0; --l) {
ans[i][j]=strs[i][j];//从g开始
i-=ys[k];
j-=xs[k];
}
return;
}
if(i+ys[k]<0||j+xs[k]<0||i+ys[k]>N-1||j+xs[k]>N-1){
return;
}
char next =strs[i+ys[k]][j+xs[k]];
//判断下一个字符是否符合
if(flag[depth+1]==next)
dfs(i+ys[k],j+xs[k],depth+1,k);
}
int main() {
scanf("%d", &N);
int temp = 0;
while (temp < N) {
scanf("%s", &strs[temp++]);
}
for (int l = 0; l < N; ++l) {
for (int i = 0; i < N; ++i) {
ans[l][i]='*';
}
}
for (int i = 0; strs[i][0] !='\0'; ++i) {
for (int j = 0; strs[i][j] !='\0'; ++j) {
if(strs[i][j]=='y'){
dfs(i,j,1,0);
dfs(i,j,1,1);
dfs(i,j,1,2);
dfs(i,j,1,3);
dfs(i,j,1,4);
dfs(i,j,1,5);
dfs(i,j,1,6);
dfs(i,j,1,7);
}
}
}
for (int k = 0; k < N; ++k) {
printf("%s\n",ans[k]);
}
return 0;
}

搜索--P1101 单词方阵的更多相关文章

  1. 洛谷 P1101 单词方阵

    题目链接 https://www.luogu.org/problemnew/show/P1101 题目描述 给一n×n的字母方阵,内可能蕴含多个"yizhong"单词.单词在方阵中 ...

  2. 洛谷P1101单词方阵

    题目描述 给一n×n的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的. 摆放可沿着 8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有 ...

  3. P1101 单词方阵

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

  4. P1101 单词方阵(DFS)

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

  5. 洛谷P1101 单词方阵——S.B.S.

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

  6. P1101 单词方阵 简单dfs

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

  7. 洛谷P1101 单词方阵【暴力】【字符串】

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

  8. 洛谷P1101 单词方阵

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

  9. 洛谷P1101 单词方阵【DFS】

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

随机推荐

  1. 有意思的RTL函数RegisterClass(在持久化中,你生成的一个新类的对象,系统并不知道他是如何来的,因此需要你注册)good

    例子1:Delphi中使用纯正的面向对象方法(这个例子最直接) Delphi的VCL技术使很多程序员能够非常快速的入门:程序员门只要简单的拖动再加上少量的几个Pascal语句,呵呵,一个可以运行得非常 ...

  2. JPG文件格式

    开始:0xFF 0xD8 结束:0xFF 0xD9 文件的宽高:0xFF 0xC0 之后隔二个字节(0x11 0x08 这二个字节一般是固定的.描述这个块的长度.) 然后用四个字节来存储图片的高和宽0 ...

  3. Oracle利用游标返回结果集的的例子(C#)...(最爱)

    引用地址:http://www.alixixi.com/program/a/2008050727634.shtml   本例在VS2005+Oracle 92010 + WindowsXp Sp2测试 ...

  4. python utc时间转换为strftime

    拿来主义: from datetime import datetimefrom time import timetime_sec = time()def time2str(time_with_sec) ...

  5. Java IO 字节流与字符流 (二)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  6. 基于Flink的视频直播案例(下)

    目录 直播数字化运营 结果写入Elasticsearch 第二种思路 Flink实现总结 Elasticsearch部分 Kibana部分 直播数字化运营 业务目标 全站观看直播总人数以及走势 房间直 ...

  7. Hibernate的表之间的关系

    表:A.B 一对多关系:A中的一个字段的记录(主键)引用B中的多个记录(外键) 多对一关系:A中的一个字段的记录(外键)引用B中的一个记录(主键) 一对一关系:A.B两个表的关联字段都是主键 多对多关 ...

  8. robotframework - 测试用例&套件- Settings标签

    1.Test Case -- Settings标签截图 2.Test Case Settings 标签说明: Documentation:用于描述用例的一个小文本,它可以把 URL 地址转换为可点击的 ...

  9. sql 索引详解

    索引的重要性 数据库性能优化中索引绝对是一个重量级的因素,可以说,索引使用不当,其它优化措施将毫无意义. 聚簇索引(Clustered Index)和非聚簇索引 (Non- Clustered Ind ...

  10. Vue知识点小总结1

    ES6常用语法 变量的定义 let定义变量 不会变量提升 有全局作用域和函数作用域,块级作用域{} 不能重复定义 var定义变量 会变量提升 只有全局作用域和函数作用域 能够重复定义 const定义变 ...