简单的搜索——遍历(7)
题目来源:洛谷 P1101 单词方阵
共五个测试点
题解
AC代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 105;
// 地图数组和标记数组
char mp[maxn][maxn], vis[maxn][maxn];
int n;
// 方向数组
int dx[8] = {0, 1, 1, 1, 0, -1, -1, -1}, dy[8] = {1, 1, 0, -1, -1, -1, 0, 1};
// 初始化输入
void init()
{
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
for (int i = 1; i <= n; ++i)
scanf("%s", mp[i] + 1);
}
void solve()
{
// 遍历地图
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
// 如果等于 y 开始遍历8个方向
if (mp[i][j] == 'y')
{
// 遍历 8 个方向
for (int k = 0; k < 8; ++k)
{
int tx = i, ty = j;
// 标记
bool f = 1;
// 遍历 6 个字母
for (int t = 1; t <= 6; ++t)
{
tx += dx[k], ty += dy[k];
// 超出边界,标记为 0
if (tx < 1 || ty < 1 || tx > n || ty > n)
f = 0;
if (f == 0)
break;
// 遍历 6 个字母
if (t == 1 && mp[tx][ty] != 'i')
f = 0;
else if (t == 2 && mp[tx][ty] != 'z')
f = 0;
else if (t == 3 && mp[tx][ty] != 'h')
f = 0;
else if (t == 4 && mp[tx][ty] != 'o')
f = 0;
else if (t == 5 && mp[tx][ty] != 'n')
f = 0;
else if (t == 6 && mp[tx][ty] != 'g')
f = 0;
}
tx = i, ty = j;
// 如果标记为 1 ,更改标记数组内容
if (f == 1)
{
vis[tx][ty] = 1;
for (int t = 1; t <= 6; ++t)
{
tx += dx[k], ty += dy[k];
vis[tx][ty] = 1;
}
}
}
}
}
}
}
int main()
{
init();
solve();
// 如果 vis[x][y] = 1,则输出 mp[x][y]
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
if (vis[i][j] == 1)
printf("%c", mp[i][j]);
else
printf("*");
}
printf("\n");
}
return 0;
}