zoukankan      html  css  js  c++  java
  • 洛谷1101:单词方阵(DFS)

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

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

    输入输出格式

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

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

    输出格式:
    突出显示单词的n×nn imes 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
    

    思路

    设置方向数组,找到字母"y"的位置,然后利用方向数组来找和"y"相邻的"i",然后在这个方向上进行dfs,如果在该方向上可以组成单词"yizhong",把这些位置记录一下,所有的点遍历结束后,输出就可以了

    AC代码

    #include <bits/stdc++.h>
    #define ms(a) memset(a,0,sizeof(a))
    using namespace std;
    char ch[110][110];
    int vis[110][110];
    int n;
    int dis[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
    char cha[]="yizhong";
    struct Node
    {
        int x,y;
    }p[1000];
    void dfs(int x,int y,int res,int k)
    {
        if(res==7)
            for(int i=0;i<7;i++)
                vis[p[i].x][p[i].y]=1;
        int dx=x+dis[k][0];
        int dy=y+dis[k][1];
        if(ch[dx][dy]==cha[res+1]||res==6)
        {
            p[res].x=x;
            p[res].y=y;
            dfs(dx,dy,res+1,k);
        }
    }
    int main()
    {
        ms(vis);
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>ch[i];
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(ch[i][j]=='y')
                {
                    for(int k=0;k<8;k++)
                    {
                        int x=i+dis[k][0];
                        int y=j+dis[k][1];
                        if(ch[x][y]=='i')
                            dfs(i,j,0,k);
                    }
                }
            }
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                if(vis[i][j])
                    cout<<ch[i][j];
                else
                    cout<<"*";
            }
            cout<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    LCA算法
    poj1364(差分约束系统)
    dij算法为什么不能处理负权,以及dij算法变种
    差分约束系统
    最短路专辑
    LightOJ1348 树链剖分
    FZU2082树链剖分
    HYSBZ1036 树链剖分
    poj3237 树链剖分 暴力
    poj2763 树链剖分(线段树)
  • 原文地址:https://www.cnblogs.com/Friends-A/p/10324325.html
Copyright © 2011-2022 走看看