zoukankan      html  css  js  c++  java
  • 洛谷 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。(7 <= n <= 100)。
    
    第二行开始输n×n的字母矩阵。
    
    输出格式:
    突出显示单词n×n矩阵。
    
    输入输出样例
    输入样例#17
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    aaaaaaa
    
    
    输出样例#1
    *******
    *******
    *******
    *******
    *******
    *******
    *******
    
    
    输入样例#28
    qyizhong
    gydthkjy
    nwidghji
    orbzsfgz
    hhgrhwth
    zzzzzozo
    iwdfrgng
    yyyygggg
    
    
    输出样例#2*yizhong
    gy******
    n*i*****
    o**z****
    h***h***
    z****o**
    i*****n*
    y******g

    我的题解:

     1 #include "bits/stdc++.h"
     2  
     3 using namespace std;
     4 
     5 char **c,**visited,**flag;
     6 int n,dir[8][2]={0,1,1,0,0,-1,-1,0,1,1,1,-1,-1,-1,-1,1};
     7 
     8 
     9 void input(){
    10     cin >> n; 
    11     c = (char**)malloc(sizeof(char*)*n);
    12     visited = (char**)malloc(sizeof(char*)*n);
    13     flag = (char**)malloc(sizeof(char*)*n);
    14     for(int i = 0; i < n; i ++){
    15         c[i] = (char*)malloc(sizeof(char)*n);
    16         visited[i] = (char*)malloc(sizeof(char)*n);
    17         flag[i] = (char*)malloc(sizeof(char)*n);
    18         for(int j = 0; j < n; j ++){
    19             cin >> c[i][j];
    20             visited[i][j] = 0;
    21             flag[i][j] = 0;
    22         }
    23     }
    24 }
    25 void print(){
    26     for(int i = 0; i < n; i ++){
    27         for(int j = 0; j < n; j ++){
    28             if(flag[i][j])
    29                 cout << c[i][j]; 
    30             else
    31                 cout << "*";
    32         }
    33         cout << endl;
    34     }
    35     cout << endl;
    36 }
    37 void mark(){
    38     for(int i = 0; i < n; i ++)
    39         for(int j = 0; j < n; j ++)
    40             if(visited[i][j]) flag[i][j] = 1;
    41 }
    42 void f(int x, int y,int x1, int y1,char* word,int len,int index){
    43     if(index == len){
    44         // success 
    45         mark();
    46         return; 
    47     }
    48     if(x == n || y == n || x < 0 || y < 0){
    49         // over bound
    50         return;
    51     }
    52     if(visited[x][y]){
    53         // visited
    54         return;
    55     }
    56     visited[x][y] = 1;
    57     if(word[index] == c[x][y]){
    58         f(x+x1, y+y1, x1, y1, word, len, index+1);
    59     }
    60     
    61     visited[x][y] = 0;
    62 }
    63 
    64 int main(){
    65     input();
    66     char *word = "yizhong";
    67     for(int i = 0; i < n; i ++){
    68         for(int j = 0; j < n; j ++){
    69             for(int k = 0; k < 8; k ++){
    70                 f(i, j,dir[k][0],dir[k][1],word,strlen(word),0);
    71             }
    72         }
    73     }
    74     print(); 
    75     return 0;
    76 } 
    View Code
  • 相关阅读:
    playbook的复用
    playbook 任务标签
    playbook handlers 触发器
    playbook循环语句
    playbook条件语句
    Ansible变量
    每日总结4.13
    每日总结4.12
    每日总结4.9
    每日总结4.8
  • 原文地址:https://www.cnblogs.com/nanshaobit/p/12464636.html
Copyright © 2011-2022 走看看