题目描述

给一n×n的字母方阵,内可能蕴含多个“yizhong”单词。单词在方阵中是沿着同一方向连续摆放的。

摆放可沿着 8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。

输出时,将不是单词的字母用*代替,以突出显示单词。例如:

输入:                    输出:

8

qyizhong                *yizhong

gydthkjy                  gy******

nwidghji                   n*i*****

orbzsfgz                  o**z****

hhgrhwth                 h***h***

zzzzzozo                   z****o**

iwdfrgng                   i*****n*

yyyygggg                 y******g

输入输出格式

输入格式:

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

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

输出格式:

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

样例#1:

输入:                            

7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出:
*******
*******
*******
*******
*******
*******
******* 样例#2:
输入:
8
qyizhong
gydthkjy
nwidghji
orbzsfgz
hhgrhwth
zzzzzozo
iwdfrgng
yyyygggg
输出:
*yizhong
gy******
n*i*****
o**z****
h***h***
z****o**
i*****n*
y******g
 分析:
这道题挺有趣的我可能写的大部分都是模拟的代码,就是敲的有点烦.
正解,有题目我们可以得知我们要求连续的字符串"yizhong",且组成字符串的字母的顺序不可改变,搜索该怎么搜?
因此我们必须确定搜索方向我们可以发现当我们知道字母'y'和字母'i'时我们就可以确定搜索的方向了想到这里这题就很简单了,
剩下的字母我们就可以用一个循环来依次找到.
输出的处理,因为题目要求只输出合格的字符串剩下的仅输出'*'那么我们可以用一个bool型变量judge[i][j]来判断如果它是合格的就赋值为true
否则赋值为false接下来判断一下是否合格就可以输出了
代码:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
const int N=+;
char Map[N][N],keay[N][N];
int startx,starty,n;
int dirx[]={,,-,,,-,,-};//八个方向
int diry[]={,,,-,,,-,-};
bool judge[N][N];
void color(int ,int ,int );
void direct(int, int ,int );
void dfs(int x,int y)
{
for(int i=;i<;i++)
{
int xx=dirx[i]+startx;
int yy=diry[i]+starty;
if(xx<||xx>n||yy<||yy>n) continue;//边界
if(Map[xx][yy]=='i')//找'i'
{
direct(xx,yy,i);
}
}
}
void direct(int x,int y,int f)//f为这个字符串的方向
{
int xx=x,yy=y;
int cnt=;
for(int i=;i<=;i++)//因为只剩下5个没有找到的字母所以只用循环5次
{
xx=xx+dirx[f];
yy=yy+diry[f];
if(i==)
{
if(Map[xx][yy]=='z')
cnt++;
}
if(i==)
{
if(Map[xx][yy]=='h')
cnt++;
}
if(i==)
{
if(Map[xx][yy]=='o')
cnt++;
}
if(i==)
{
if(Map[xx][yy]=='n')
cnt++;
}
if(i==)
{
if(Map[xx][yy]=='g')
cnt++;
}
if(cnt==)
color(xx,yy,f);
}
return;
}
void color(int x,int y,int f)//赋值操作
{
int xx=x;
int yy=y;
judge[x][y]=true;
for(int i=;i<=;i++)//倒着回去赋值
{
xx=xx-dirx[f];
yy=yy-diry[f];
judge[xx][yy]=true;
}
}
int main()
{
cin>>n;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
cin>>Map[i][j];
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(Map[i][j]=='y')
{
startx=i;starty=j;
dfs(startx,starty);
}
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(judge[i][j])
cout<<Map[i][j];
else
cout<<"*";
}
cout<<endl;
}
return ;
}

洛谷P1101单词方阵的更多相关文章

  1. 洛谷 P1101 单词方阵

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

  2. 洛谷——P1101 单词方阵

    https://www.luogu.org/problem/show?pid=1101#sub 题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放 ...

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

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

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

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

  5. 洛谷P1101 单词方阵

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

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

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

  7. 洛谷 P1101单词方阵

    我已经,是这个世界上,最幸福的女孩了                                                                         ——<末日时 ...

  8. 集训作业 洛谷P1101 单词方阵

    这个题的长度真的有点长,我直接放图片吧 这个题又是一个和谐的搜索,找到yizhong的y就开始8面搜索,遇见正确的字母就继续搜索,不正确就果断放弃,果然又是一个和谐的搜索呢. #include< ...

  9. 洛谷P1101 单词方针

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

随机推荐

  1. Netbackup-Oracle数据库恢复演练(上)

    目录 第一章NBU实施内容 1 第二章 环境准备 1 2.1添加LICENSE: 1 2.2安装配置NBU客户端(linux,unix相同) 2 2.3配置并验证oracle备份脚本 3 2.4添加备 ...

  2. nodejs使用MYSQL连接池,断线重连

    两种方式解决1.你可以配置mysql的连接池 var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost' ...

  3. Maven 配置本地依赖jar

    现有json-1.0.jar,引入依赖方法如下: 1.  在项目下新建 lib 目录,复制json-1.0.jar到lib目录下 pom.xml中添加配置 <dependency> < ...

  4. sql的where条件转换成mongdb筛选条件

    解析字符串 filterModel1 and filterModel2 and (filterModel3 or filterModel4) 1.转换成mongo的筛选条件 /// <summa ...

  5. OpenMP常用函数

    1.设置线程数目 定义如下: void omp_set_num_threads(int num_threads); 通过该函数来指定其后用于并行计算的线程数目,其中参数num_threads就是指定的 ...

  6. powerdesigner15 反向工程

  7. python 计算提成代码

    while True: with open('8564.txt') as f: r = f.readlines() start = input("请输入要查询的日期,例如20180101 : ...

  8. Linux实战教学笔记15:用户管理初级(下)

    第十四节 用户管理初级(下) 标签(空格分隔): Linux实战教学笔记-陈思齐 ---更多资料点我查看 1,用户查询相关命令id,finger,users,w,who,last,lastlog,gr ...

  9. Ubuntu 18.04 配置

    Ubuntu 18.04 配置IP-静态(UB与其他linux os不同) sudo netplan generate sudo vim /etc/netplan/50-cloud-init.yaml ...

  10. (二)活用ComponentScan

    项目改造成spring cloud项目后,有非常多组件是复用的,比如(一)敏感信息混淆的组件,比如数据库.Redis等配置, 比如常用的api组件Swagger配置.每个微服务组件里都会有若干个组件随 ...