zoukankan      html  css  js  c++  java
  • BDFZOI 寻找bdfz

    难度:普及

    题目类型:枚举

    提交次数:1

    涉及知识:DFS

    描述

    在一个n*n的字母方阵中内可能包含多个“bdfz”单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间有可能共用字母。

    输出时,将不是单词的字母用“.”代替,以突出显示单词。

    输入第一行输入一个数n。(7<=n<=10)。
    第二行开始输入n*n的字母矩阵。输出突出显示单词的n*n矩阵。

    样例输入

    6
    qybzhz
    gbdfzk
    bwfdxh
    odzfdb
    zffrbb
    fdzzzo

    样例输出

    ..b...
    .bdfz.
    b.f...
    .dzfdb
    ..f...
    ...z..

    代码:

     1 #include<iostream>
     2 using namespace std;
     3 int n;
     4 char a[11][11];
     5 char b[11][11];
     6 int dirx[8] = {-1, -1, -1, 0, 0, 1, 1, 1};
     7 int diry[8] = {0, -1, 1, 1, -1, 0, -1, 1}; 
     8 char s[5] = {'0','b','d','f','z'}; 
     9 
    10 void dfs(int i, int j, int step, int dir){
    11     if(step == 4){
    12         for(int k = 0; k <= 3; k++)
    13             b[i-k*dirx[dir]][j-k*diry[dir]] = a[i-k*dirx[dir]][j-k*diry[dir]];
    14         return;
    15     }
    16     else if(step == 1){
    17         for(int k = 0; k < 8; k++){
    18             //cout<<a[i+dirx[k]][j+diry[k]]<<endl;
    19             if(a[i+dirx[k]][j+diry[k]]==s[step+1]){
    20                 
    21                 dfs(i+dirx[k], j+diry[k], step+1, k);
    22             }
    23         }
    24                         
    25     }
    26     else{
    27         if(a[i+dirx[dir]][j+diry[dir]]==s[step+1])
    28             dfs(i+dirx[dir],j+diry[dir],step+1, dir);
    29     }
    30 }
    31 
    32 int main(){
    33     cin>>n;
    34     int i, j;
    35     for(i = 1; i <= n; i++)
    36         for(j = 1; j <= n; j++){
    37             cin>>a[i][j];
    38 } 
    39     for(i = 1; i <= n; i++)
    40         for(j = 1; j <= n; j++){
    41             if(a[i][j]=='b')
    42                 dfs(i,j,1,0);
    43         }
    44     for(i = 1; i <= n; i++){
    45         for(j = 1; j <= n; j++)
    46             if(b[i][j]==0) cout<<".";
    47             else cout<<b[i][j];
    48         cout<<endl;
    49     }
    50     return 0;
    51 }

    备注:

    议事会上写的。

    不考虑代码复杂(长)度的话,直接枚举就行了。不过尊重它作为一道老师让我们练DFS的题,我还是费了一些脑筋思考怎么DFS。。其实本质还是枚举。

    dfs有四个参量i,j为坐标,step为第几个数,dir为方向,因为一个单词中间不能换方向。对于b来说,它可以往八个方向“发展”,即为k。但到了step2方向就确定了,只能朝这个方向走。

    判断每一步是否合法就用到了s数组构造的映射。这个是自己想到的,之后发现好多人生写DFS都是这么用的。。

    注意是step==4的时候为边界条件。本质上我一般用的dfs格式都是在当前位置判断下一个是否符合条件,标记。所以这里不是step==5。到了边界条件后就回溯,标记。。

    输入输出遇到奇怪的问题是因为智障把数据类型写成了int,还百思不得其解了半天,把输入那三行来回来去看了半天,啥也没看出来。直到瞄了一眼全局变量。。

    
    
  • 相关阅读:
    sscanf 与 ssprintf 用法 (转载--https://www.cnblogs.com/Anker/p/3351168.html)
    PYTHON网络爬虫与信息提取[信息的组织与提取](单元五)
    PYTHON网络爬虫与信息提取[BeautifulSoup](单元四)
    PYTHON网络爬虫与信息提取[网络爬虫协议](单元二)
    Python网络爬虫与信息提取[request库的应用](单元一)
    scikit-learn实现ebay数据分析 的随笔
    machine leanring 笔记 vectorization
    machine learning 笔记 normal equation
    machine leanring 笔记 octave命令笔记
    UVa 1354 天平难题 Mobile Computing
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/6520017.html
Copyright © 2011-2022 走看看