• 洛谷P1101 单词方针


    题目描述

    给一 n×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

    输入输出格式

    输入格式:

    第一行输入一个数 n。( 7n100 )。

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

    输出格式:

    突出显示单词的n*n 矩阵。

    输入输出样例

    输入样例#1: 
    7
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    
    输出样例#1: 
    *******
    *******
    *******
    *******
    *******
    *******
    *******
    分析:因为是要找沿着八个方向的单词“yizhong”,我们想到了要遍历而且是深度优先,沿八个方向就想着建立方向数组,这时候注意建立方向数组的时候一定要保证方向相反的两个方向下标
    之和应该为7,这样可以方便我们回溯,本题采用的是染色法,题目质量不错,可以多看看。
     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 int n;char a[110][110];
     4 int bj[110][110];
     5 char book[7]="izhong";
     6 int dx,dy; 
     7 int nexts[8][2]={{0,1},{1,1},{1,0},{1,-1},{-1,1},{-1,0},{-1,-1},{0,-1}};//按照相反的相加和为7来设置方向 
     8 void ranse(int x,int y,int step,int fang){
     9     if(step>=7)    return;//如果染色完毕,则返回。 
    10     bj[x][y]=1;//标记,在之后的染色操作中跳过
    11     //cout<<233<<endl;
    12     dx=x+nexts[fang][0];
    13     dy=y+nexts[fang][1];
    14     ranse(dx,dy,step+1,fang);//开始染色后就始终保持方向不变 
    15 } 
    16 void dfs(int x,int y,int step,int fang){
    17     if(x<0||x>n||y<0||y>n)    return;    //防止越界 
    18     if(step>=6){//如果step为6则说明都满足 
    19         ranse(x,y,0,7-fang);//注意此时传进去的是反方向
    20         return ;//注意返回 
    21     }
    22     //cout<<233<<endl;
    23     dx=x+nexts[fang][0];//这里是开始方向迁移 
    24     dy=y+nexts[fang][1];
    25     if(a[dx][dy]!=book[step])    return ;//不满足则返回 
    26     //cout<<233<<endl;
    27     dfs(dx,dy,step+1,fang);//沿着一个方向一直走 
    28 }
    29 int main(){
    30     cin>>n;
    31     for(int i=1;i<=n;i++){
    32         for(int j=1;j<=n;j++){
    33             cin>>a[i][j];
    34         }
    35     }
    36     for(int i=1;i<=n;i++){
    37         for(int j=1;j<=n;j++){
    38                 if(a[i][j]=='y'){
    39                 for(int fang=0;fang<8;fang++){
    40                     dfs(i,j,0,fang);
    41                 }
    42             }
    43         }
    44     }
    45     for(int i=1;i<=n;i++){
    46         for(int j=1;j<=n;j++){
    47             if(bj[i][j]!=1)    
    48             a[i][j]='*';
    49             cout<<a[i][j];
    50         }
    51         cout<<endl;
    52     }
    53     return 0;
    54 }
     
  • 相关阅读:
    看net2.0头晕眼花,是不是该做个具体的程序呢
    安装SQLServer2000时,提示"以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机"
    刚装的WIN7,用了一下午,记一下备忘
    不同系统开启和关闭fso的方法(转)
    希腊字母以及发音
    meta 标签的作用
    电信禁止路由上网的最佳破解方法(转)
    安装系统
    网络工程师笔记
    GHOST操作
  • 原文地址:https://www.cnblogs.com/qingjiuling/p/9458808.html
Copyright © 2020-2023  润新知