#include <stdio.h>
#include <string.h>
void printMatrix(char matrix[100][100], int n, char marked[100][100]) {
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (marked[i][j]) {
printf("%c", matrix[i][j]);//标记过就正常输出
}
else {
printf("*");//没标记就输出*
}
}
printf("\n");
}
}
void searchAndMark(char matrix[100][100], int n, char word[8], int row, int col, int dr, int dc, char marked[100][100]) {
int len = strlen(word);
for (int k = 0; k < len; k++) {
int ni = row + k * dr;
int nj = col + k * dc;//dr为0竖着找,dc为0横着找,drdc都有对角线找
if (ni < 0 || ni >= n || nj < 0 || nj >= n || (matrix[ni][nj] != word[k])) {
return;//越界或者不等于“yizhong”的顺序字符(k从0开始)则返回矩阵的下一个元素(下一个点)
}
}
//八个方位都搜刮过一遍,以下已为找到的了,现在我们要将它标记
for (int k = 0; k < len; k++) {
int ni = row + k * dr;
int nj = col + k * dc;
marked[ni][nj] = 1;
}
}
void searchWord(char matrix[100][100], int n, char word[8], char marked[100][100]) {
int directions[8][2] = {
{-1, -1}, {-1, 0}, {-1, 1},
{0, -1}, {0, 1},
{1, -1}, {1, 0}, {1, 1}
};//八个方向,这样好看一些
//{-1, -1},
//{-1, 0},
//{-1, 1},
//{ 0, -1},
//{ 0, 1},
//{ 1, -1},
//{ 1, 0},
//{ 1, 1}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
for (int d = 0; d < 8; d++) {
int dr = directions[d][0];
int dc = directions[d][1];
searchAndMark(matrix, n, word, i, j, dr, dc, marked);
}
}
}
}
int main() {
int n;
scanf("%d", &n);
char matrix[100][100];
char marked[100][100] = { 0 }; // Initialize marked array with zeros
for (int i = 0; i < n; i++) {
scanf("%s", matrix[i]);
}
char word[8] = "yizhong";
searchWord(matrix, n, word, marked);
printMatrix(matrix, n, marked);
return 0;
}
洛谷p1101单词方阵(搜索和矩阵)
最新推荐文章于 2024-08-09 23:16:43 发布