题目 https://www.luogu.com.cn/problem/P1101
题目要求输出包含 yizhong 所有方向排列的矩阵图
观察答案除了yizhong 均为星号
因此我们可以用bool数组来标记每个位置的状态
定义星号为无效状态 false
我们对原矩阵图 进行遍历
每当找到一个y就试一下它各个方向是否满足
yizhong
如果有一个方向满足条件 就将该方向所有满足条件的位置打上有效标志
题目规定可以交叉可以共用 因为我们有效状态都是标记为true
所以一个位置标记几次true都没事 对我们的答案没有影响
完整代码
#include<bits/stdc++.h>
using namespace std;
const int N=110;
char a[N][N];
int n;
char c[8]={'y','i','z','h','o','n','g'}; //用于检查答案的数组
int dir[8][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
//搜索的八个方向的数组 搜索小技巧
bool b[N][N];//状态数组
void check(int x,int y){
for(int i=0;i<8;i++){
for(int j = 0;j <= 6;j++)
{
int dx = x + j*dir[i][0];
int dy = y + j*dir[i][1];
//搜索该方向所有位置是否匹配
if(a[dx][dy] != c[j]){
break ;//有一个不匹配就退出当前循环
}
if(a[dx][dy]=='g')
{
//当前循环完毕所有条件均匹配 将沿途位置打上有效的标记
for(int j = 0;j <= 6;j++)
{
int dx = x + j*dir[i][0];
int dy = y + j*dir[i][1];
if(a[dx][dy] == c[j])
{
b[dx][dy] = true;
}
}
}
}
}
}
int main(){
cin>>n;
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
cin>>a[i][j];
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(a[i][j]=='y'){//遍历检查y
check(i,j);
}
}
}
for(int i = 1;i <= n;i++){
for(int j = 1;j <= n;j++){
if(b[i][j]==true){//如果有效输出原来位置的字母
cout<<a[i][j];
}else{
cout<<'*';
}
}
cout<<endl;
}
return 0;
}