zoukankan      html  css  js  c++  java
  • 洛谷P1101 单词方阵(深搜)

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

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

    输出格式
    突出显示单词的n×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了就说明它附近可能会有我们要找的单词 yizhong
    于是接下来沿着8个方向找izhong, 如果越界或者不符合就舍弃, 如果找到了就记录在ans数组里面,
    最后输出ans数组
    代码简化技巧

    1. 方向数组的运用
    const int dx[] = {1, 1, 1, 0, 0, -1,-1,-1 };  
    const int dy[] = {1, 0,-1, 1,-1, 0 , 1,-1 };
    
    1. 定义常量比较数组
    const string cmp = "yizhong"; 
    

    这样判断是否有izhong的时候就比较方便 可以用一个for循环,比如,x行y列有个“y”,以第i个方向为例:

    for(int j = 1;j <= 6;j++) { //以1个方向比较 “izhong”   
                int nx = x + j*dx[i];    
                int ny = y + j*dy[i];
                if(nx < 1 || nx > n || ny < 1 || ny > n) { //判越界 
                    flag = 0;
                    break;
                }
                if(cmp[j] != A[nx][ny]) {  
                    flag = 0;
                    break;
                }
            }
    

    这里j是步长,这里的j正好对应了yizhong 的第j位 所以正好可以对应起来

    完整代码:

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    const int maxn = 110;
    const int dx[] = {1, 1, 1, 0, 0, -1,-1,-1 };  //方向数组 
    const int dy[] = {1, 0,-1, 1,-1, 0 , 1,-1 };
    const string cmp = "yizhong"; // 比较数组 
    
    char A[maxn][maxn], ans[maxn][maxn];
    int mark[maxn][maxn], n;
    
    void dfs(int x,int y) {
        for(int i = 0;i < 8;i++) {  //枚举8个方向 
            int flag = 1;
            for(int j = 1;j <= 6;j++) { //以1个方向比较 “izhong”   
                int nx = x + j*dx[i];    
                int ny = y + j*dy[i];
                if(nx < 1 || nx > n || ny < 1 || ny > n) { //判越界 
                    flag = 0;
                    break;
                }
                if(cmp[j] != A[nx][ny]) {  //判断第j位是否符合 
                    flag = 0;
                    break;
                }
            }
            if(flag == 0) continue;
            for(int j = 0;j <= 6;j++) { //符合就记录在ans数组里 
                int nx = x + j*dx[i];
                int ny = y + j*dy[i];
                ans[nx][ny] = A[nx][ny];
            }
        }
        return;
    }
    
    int main() {
        cin >> n;
        for(int i = 1;i <= n;i++) {
            for(int j = 1;j <= n;j++) {
                cin >> A[i][j];
            }
        }
    
        for(int i = 1;i <= n;i++) { 
            for(int j = 1;j <= n;j++) {
                if(A[i][j] == 'y') dfs(i,j);//如果发现有y就开始搜索 
            }
        }
        for(int i = 1;i <= n;i++) { //输出 
            for(int j = 1;j <= n;j++) {
                if(ans[i][j] == 0) ans[i][j] = '*';
                //如果没有改动就输出* ,0为空字符串,可以为'';
                cout << ans[i][j];
            }
            cout << endl;
        }
        return 0;
    } 
    
  • 相关阅读:
    Python序列——字符串
    Python序列——序列操作
    Python数字
    Python对象
    Python基础
    关于PATH_INFO SCRIPT_NAME SCRIPT_FILENAME REDIRECT_URL 详解
    转:Nginx配置指令location匹配符优先级和安全问题
    转:mysql 创建一个用户,指定一个数据库
    【洛谷P3384】树链剖分
    【洛谷P1833】樱花
  • 原文地址:https://www.cnblogs.com/yonglin1998/p/11780821.html
Copyright © 2011-2022 走看看