洛谷P1101 单词方阵 题解

题目描述

给一n \times 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 \times nn×n的字母矩阵。

输出格式:

突出显示单词的n \times nn×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

题解

对方阵中的每一个元素进行搜索,搜索此元素的八个方向上是否能连成单词“yizhong”,这里需要注意搜索一个方向时不能拐弯,所以要确立方向。将方向作为dfs的参数之一。

#include <iostream>
#include <string>
using namespace std;
string s[101], k = "yizhong";
int n, g[101][101] = { 0 };
void dfs(int x, int y, int t, string h, int f) {
    if (t == k.size() && h == k) {           //如果连成,就把用到过的字符标记为1
        if (f == 1) {
            for (int i = 0; i < t; i++) {
                g[x][y - 1 - i] = 1;
            }
        }
        else if (f == 2) {
            for (int i = 0; i < t; i++) {
                g[x - 1 - i][y - 1 - i] = 1;
            }
        }
        else if (f == 3) {
            for (int i = 0; i < t; i++) {
                g[x - 1 - i][y] = 1;
            }
        }
        else if (f == 4) {
            for (int i = 0; i < t; i++) {
                g[x - 1 - i][y + 1 + i] = 1;
            }
        }
        else if (f == 5) {
            for (int i = 0; i < t; i++) {
                g[x][y + 1 + i] = 1;
            }
        }
        else if (f == 6) {
            for (int i = 0; i < t; i++) {
                g[x + 1 + i][y + 1 + i] = 1;
            }
        }
        else if (f == 7) {
            for (int i = 0; i < t; i++) {
                g[x + 1 + i][y] = 1;
            }
        }
        else if (f == 8) {
            for (int i = 0; i < t; i++) {
                g[x + 1 + i][y - 1 - i] = 1;
            }
        }
    }
    else if (x < 0 || x >= n || y < 0 || y >= n) return;  //判断越界,如果越界就不继续向前搜索
    else if (t == 0) {   //如果为第一次判断,向八个方向搜索
        dfs(x, y + 1, t + 1, h, 1);
        dfs(x + 1, y + 1, t + 1, h, 2);
        dfs(x + 1, y, t + 1, h, 3);
        dfs(x + 1, y - 1, t + 1, h, 4);
        dfs(x, y - 1, t + 1, h, 5);
        dfs(x - 1, y - 1, t + 1, h, 6);
        dfs(x - 1, y, t + 1, h, 7);
        dfs(x - 1, y + 1, t + 1, h, 8);
    }
    else {                //向前搜索
        if (f == 1 && s[x][y] == k[t]) {
            dfs(x, y + 1, t + 1, h + k[t], 1);
        }
        else if (f == 2 && s[x][y] == k[t]) {
            dfs(x + 1, y + 1, t + 1, h + k[t], 2);
        }
        else if (f == 3 && s[x][y] == k[t]) {
            dfs(x + 1, y, t + 1, h + k[t], 3);
        }
        else if (f == 4 && s[x][y] == k[t]) {
            dfs(x + 1, y - 1, t + 1, h + k[t], 4);
        }
        else if (f == 5 && s[x][y] == k[t]) {
            dfs(x, y - 1, t + 1, h + k[t], 5);
        }
        else if (f == 6 && s[x][y] == k[t]) {
            dfs(x - 1, y - 1, t + 1, h + k[t], 6);
        }
        else if (f == 7 && s[x][y] == k[t]) {
            dfs(x - 1, y, t + 1, h + k[t], 7);
        }
        else if (f == 8 && s[x][y] == k[t]) {
            dfs(x - 1, y + 1, t + 1, h + k[t], 8);
        }
    }
}
int main() {
    cin >> n;
    for (int i = 0; i < n; i++) cin >> s[i];
    for (int i = 0; i < n; i++)      //每一个字符做起点搜索
        for (int j = 0; j < n; j++) {
            string l = "0";
            l[0] = s[i][j];
            dfs(i, j, 0, l, 0);
        }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (g[i][j] == 0) {
                cout << "*";
            }
            else {
                cout << s[i][j];
            }
        }
        cout << endl;
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/LackProgramMonkey/p/9862499.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值