单词方阵
题目描述
给一
n
×
n
n \times n
n×n 的字母方阵,内可能蕴含多个 yizhong
单词。单词在方阵中是沿着同一方向连续摆放的。摆放可沿着
8
8
8 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。输出时,将不是单词的字母用 *
代替,以突出显示单词。例如:
输入:
8 输出:
qyizhong *yizhong
gydthkjy gy******
nwidghji n*i*****
orbzsfgz o**z****
hhgrhwth h***h***
zzzzzozo z****o**
iwdfrgng i*****n*
yyyygggg y******g
输入格式
第一行输入一个数 n n n。( 7 ≤ n ≤ 100 7 \le n \le 100 7≤n≤100)。
第二行开始输入 n × n n \times n n×n 的字母矩阵。
输出格式
突出显示单词的 n × n n \times n n×n 矩阵。
样例 #1
样例输入 #1
7
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
aaaaaaa
样例输出 #1
*******
*******
*******
*******
*******
*******
*******
样例 #2
样例输入 #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. 输入方阵数据
2. 对每一个点进行搜索八个方向
3. 如果某个方向上有完整的yizhong 将对应的标志位置为1
4. 输出方阵标志位为1的 和不为1的即 *
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char arr[105][105], str[] = "yizhong";
int n, mark[105][105] = {0}, dx[] = {0, -1, -1, -1, 0, 1, 1, 1}, dy[] = {-1, -1, 0, 1, 1, 1, 0, -1};
void search(int x, int y){
int i, j, len = strlen(str), tx, ty;
for(i = 0; i < 8; i++){ // 决定方向
int flag = 1; // 字符串是否完整
for(j = 0; j < len; j++){
tx = x + j*dx[i]; // 该方向的下一个字符
ty = y + j*dy[i];
if(arr[tx][ty] != str[j]){ // 匹配不上则终止
flag = 0;
break;
}
}
if(flag == 1){ // 标志位 置1
for(j = 0; j < len; j++){
mark[x + j*dx[i]][y + j*dy[i]] = 1;
}
}
}
}
int main(){
scanf("%d\n", &n);
int i, j;
for(i = 1; i <= n; i++){ // 方阵数据输入
scanf("%s\n", &arr[i][1]);
}
for(i = 1; i <= n; i++){ //每一个点八个方向搜索
for(j = 1; j <= n; j++){
search(i, j);
}
}
for(i = 1; i <= n; i++){ //输出方阵
for(j = 1; j <= n; j++){
if(mark[i][j] == 1) putchar(arr[i][j]);
else putchar('*');
}
putchar('\n');
}
return 0;
}