• P1101 单词方阵


    题目描述
    给一 n imes nn×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 le n le 1007≤n≤100 )。

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

    输出格式:
    突出显示单词的 n imes nn×n 矩阵。

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

    *******
    *******
    *******
    *******
    *******
    *******
    *******

    题解: DFS,每次直接固定方向的搜索。

    #include <bits/stdc++.h>
    using namespace std;
    const int MAXN=110;
    char mapp[MAXN][MAXN];
    int vis[MAXN][MAXN];
    int ans[MAXN][MAXN];
    char str[]={"yizhong"};
    int n;
    int dx[8]={1,-1,0,0,1,1,-1,-1};
    int dy[8]={0,0,1,-1,1,-1,-1,1};
    bool check(int x,int y,int k)
    {
        if(x<0||x>=n||y<0||y>n||mapp[x][y]!=str[k])
            return false;
        return true;
    }
    void print()//此处是记录那些点是可以构成yizhong
    {
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                if(vis[i][j]==1)
                    ans[i][j]++;
            }
        }
    }
    void dfs(int x,int y ,int mx,int my,int k)
    {
        if(k==6&&mapp[x][y]=='g') {
            vis[x][y]=1;
            print();
            vis[x][y]=0;
            return ;
        }
        int kx=x+mx;
        int ky=y+my;
        if(check(kx,ky,k+1)){
            vis[kx][ky]=1;
            dfs(kx,ky,mx,my,k+1);
            vis[kx][ky]=0;
        }
    
    
    }
    int main() {
        scanf("%d",&n);
        for(int i=0;i<n;i++)
            scanf("%s",mapp[i]);
        memset(vis,0, sizeof(vis));
        memset(ans,0, sizeof(ans));
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                if(mapp[i][j]=='y') {
                    for(int k=0;k<8;k++) {
                        vis[i][j] = 1;
                        dfs(i, j,dx[k],dy[k] ,0);
                        vis[i][j] = 0;
                    }
                }
            }
        }
        for(int i=0;i<n;i++){
            for (int j = 0; j < n; ++j) {
                if(ans[i][j]>=1)
                    printf("%c",mapp[i][j]);
                else
                    printf("*");
            }
            printf("
    ");
        }
    
        return 0;
    }
    
    /*
    8
    qyizhong
    gydthkjy
    nwidghji
    orbzsfgz
    hhgrhwth
    zzzzzozo
    iwdfrgng
    yyyygggg
     */
  • 相关阅读:
    Qt 学习之路 2(51):布尔表达式树模型
    Qt 学习之路 2(50):自定义可编辑模型
    Qt 学习之路 2(49):自定义只读模型
    Qt 学习之路 2(48):QSortFilterProxyModel
    spring boot 定时任务
    mybatis 操作总结
    MySQL 中常用的函数
    Maven dependencies 与 dependencyManagement 区别
    springboot 校验机制 @Validated @Valid
    Fork JOIN 分而治之
  • 原文地址:https://www.cnblogs.com/-xiangyang/p/9220234.html
Copyright © 2020-2023  润新知