洛谷-P1101 单词方阵

洛谷-P1101 单词方阵

原题链接:https://www.luogu.com.cn/problem/P1101


题目描述

给一(n imes 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。((7 le n le 100))。

第二行开始输入(n imes n)的字母矩阵。

输出格式

突出显示单词的(n 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

C++代码

#include <iostream>
using namespace std;

int dir[][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
char a[100][100],b[100][100],c[]="yizhong";

void dfs(int x, int y, int k, int m) {
    if(m==6) {
        for(;m>=0;--m) {
            b[x][y]=c[m];
            x-=dir[k][0];
            y-=dir[k][1];
        }
        return ;
    }
    x+=dir[k][0];
    y+=dir[k][1];
    if(a[x][y]==c[m+1])
        dfs(x,y,k,m+1);
}

int main() {
    int n,i,j,k,x,y;
    cin>>n;
    for(i=0;i<n;++i)
        for(j=0;j<n;++j) {
            cin>>a[i][j];
            b[i][j]='*';
        }
    for(i=0;i<n;++i)
        for(j=0;j<n;++j)
            if(a[i][j]=='y')
                for(k=0;k<8;++k)
                    dfs(i,j,k,0);
    for(i=0;i<n;++i) {
        for(j=0;j<n;++j)
            cout<<b[i][j];
        cout<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/yuzec/p/12875005.html