洛谷 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
原文地址:https://www.cnblogs.com/nanshaobit/p/12464636.html