P1101 单词方阵

在这里插入图片描述

在这里插入图片描述

这道题思路还比较简单~直接dfs即可

思路:输入完 n*n的单词以后,开始逐行逐列的枚举,如果找到其中一个是y,那就观察y的8个方向,看看哪一个是 i,然后顺着yi的方向看看能不能找到一条完整的yizhong,如果能找到就将这条路径全部标记为true,到时候输出的时候可以输出这些字符,反之如果不能连续7个yizhong就没必要标记了

在这里插入图片描述

如果所示,只有连续的7个“yizhong”这几个字母我们才将他标记,最后输出的时候,标记过的原样输出,没有标记过的就输出星号,怎么样是不是很简单?下面是AC代码~

#include<iostream>
#include <cstring>
using namespace std;
#define  Max 200
char word[Max][Max];
bool flag[Max][Max];
void dfs(int now_position,int x,int y,int direction);
char a[]={"yizhong"};
int n;
int dir[9][3]={{0,0,0},{0,-1,0},{0,-1,1},{0,0,1},{0,1,1},{0,1,0},{0,1,-1},{0,0,-1},{0,-1,-1}};
    int main()
    {

        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>word[i];
        }
        memset(flag,false, sizeof(flag));
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=n-1;j++)
            {
                if(word[i][j]=='y')
                {
                    for(int d=1;d<=8;d++)
                    {
                        int nx=i+dir[d][1];
                        int ny=j+dir[d][2];
                        if(word[nx][ny]=='i')
                        {
                            dfs(1,i,j,d);
                        }
                    }
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=n-1;j++)
            {
                if(flag[i][j])
                {
                    cout<<word[i][j];
                } else
                {
                    cout<<"*";
                }
            }
            cout<<endl;
        }
        return 0;
    }

    void dfs(int now_position,int x,int y,int direction)
    {
        if(now_position==7)
        {
            for(int i=1;i<=7;i++) //如果那一个方向成立就标记为true
            {
                flag[x][y]=true;
                x-=dir[direction][1];
                y-=dir[direction][2];
            }
        }
        else
        {
            int nx=x+dir[direction][1];
            int ny=y+dir[direction][2];
            if(nx>=1&&nx<=n&&ny>=0&&ny<=n-1&&word[nx][ny]==a[now_position])
            {

                dfs(now_position+1,nx,ny,direction);
            }
            else
            {
                return ;
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值