题目描述 给一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矩阵。 输入输出样例 输入样例#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
我的题解:
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 }