P1101 单词方阵

https://www.luogu.org/problem/show?pid=1101
题目描述

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

输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入输出格式

输入格式:
第一行输入一个数n。(7<=n<=100)。

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

输出格式:
突出显示单词的nXn矩阵。

输入输出样例

输入样例#1:
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
输出样例#1:








有很多人用的是枚举,其实这题还是可以用深度优先搜索的要用到记忆化深搜

#include<bits/stdc++.h>
using namespace std;
int cx[8]={0,0,-1,1,1,1,-1,-1},cy[8]={1,-1,0,0,1,-1,1,-1},v[101][101],n,i;
char a[101][101],s[]="yizhong";
void dfs(int x,int y,int d,int t)
{
    if(d==-1)
    {
        for(int j=0;j<8;j++)
        {
              int xx=x+cx[j],yy=y+cy[j];
                   if(a[xx][yy]==s[t])

                       dfs(xx,yy,j,t+1);
        }
        return;
    }
    if(t==7)
    {
            int xx=x,yy=y;
        for(int j=1;j<=7;j++)
        {
            v[xx][yy]=1;
            xx=xx-cx[d];yy=yy-cy[d];
        }
          return;
    }
            int xx=x+cx[d],yy=y+cy[d];
                if(a[xx][yy]==s[t])
                     dfs(xx,yy,d,t+1);
}
int main()
{
    cin>>n;
    for(i=1;i<=n;i++)
        scanf("%s",a[i]+1);
        for(i=1;i<=n;i++)
           for(int j=1;j<=n;j++)
                if(a[i][j]=='y')
                       dfs(i,j,-1,1);
        for(i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                  if(v[i][j]==1)
                      cout<<a[i][j];
                      else
                      cout<<"*";
            }
            cout<<endl;
        }
            return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值