题目描述
给一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
我的题解:
#include "bits/stdc++.h"
using namespace std;
char **c,**visited,**flag;
int n,dir[8][2]={0,1,1,0,0,-1,-1,0,1,1,1,-1,-1,-1,-1,1};
void input(){
cin >> n;
c = (char**)malloc(sizeof(char*)*n);
visited = (char**)malloc(sizeof(char*)*n);
flag = (char**)malloc(sizeof(char*)*n);
for(int i = 0; i < n; i ++){
c[i] = (char*)malloc(sizeof(char)*n);
visited[i] = (char*)malloc(sizeof(char)*n);
flag[i] = (char*)malloc(sizeof(char)*n);
for(int j = 0; j < n; j ++){
cin >> c[i][j];
visited[i][j] = 0;
flag[i][j] = 0;
}
}
}
void print(){
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
if(flag[i][j])
cout << c[i][j];
else
cout << "*";
}
cout << endl;
}
cout << endl;
}
void mark(){
for(int i = 0; i < n; i ++)
for(int j = 0; j < n; j ++)
if(visited[i][j]) flag[i][j] = 1;
}
void f(int x, int y,int x1, int y1,char* word,int len,int index){
if(index == len){
// success
mark();
return;
}
if(x == n || y == n || x < 0 || y < 0){
// over bound
return;
}
if(visited[x][y]){
// visited
return;
}
visited[x][y] = 1;
if(word[index] == c[x][y]){
f(x+x1, y+y1, x1, y1, word, len, index+1);
}
visited[x][y] = 0;
}
int main(){
input();
char *word = "yizhong";
for(int i = 0; i < n; i ++){
for(int j = 0; j < n; j ++){
for(int k = 0; k < 8; k ++){
f(i, j,dir[k][0],dir[k][1],word,strlen(word),0);
}
}
}
print();
return 0;
}