其实不难,但对于我这初学者来说,还是有点烦的。
只要把八个方向的搜索方式模拟出来,边界条件控制好,还有标记函数。
边界条件的控制涉及一个技巧,这里用到的“||”只要前面的条件成立,就不会执行后面的部分,所以就不用担心数组越界,判段越界条件一定要写在前面。
#include<iostream>
using namespace std;
char a[101][101],v[101][101],ok;
char s[] = "yizhong";
void mark(int x,int y,int way){
switch(way){
case 1:for(int i = 0;i<7;i++) v[x][y+i] = 1;break;
case 2:for(int i = 0;i<7;i++) v[x][y-i] = 1;break;
case 3:for(int i = 0;i<7;i++) v[x+i][y] = 1;break;
case 4:for(int i = 0;i<7;i++) v[x-i][y] = 1;break;
case 5:for(int i = 0;i<7;i++) v[x-i][y-i] = 1;break;
case 6:for(int i = 0;i<7;i++) v[x+i][y-1] = 1;break;
case 7:for(int i = 0;i<7;i++) v[x-i][y+i] = 1;break;
case 8:for(int i = 0;i<7;i++) v[x+i][y+i] = 1;break;
}
}
int main(){
int n;
cin>>n;
for(int i = 0;i<n;i++)
cin>>a[i];
for(int i = 0;i<n;i++)
for(int j = 0;j<n;j++){
if(a[i][j]=='y'){
int p = 1,q = 1;
while(p<=6){
ok = 1;
if(j+q>=n||a[i][j+q]!=s[p] ){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,1);
p = 1;q = 1;
while(p<=6){
ok = 1;
if(j-q<0||a[i][j-q]!=s[p]){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,2);
p = 1;q = 1;
while(p<=6){
ok = 1;
if(j+q>=n||a[i+q][j]!=s[p]){ok = 0;break;}
p++;q++;
}
p = 1;q = 1;
while(p<=6){
ok = 1;
if(i+q>=n||a[i+q][j]!=s[p]){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,3);
p = 1;q = 1;
while(p<=6){
ok = 1;
if(i-q<0||a[i-q][j]!=s[p]){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,4);
p =1;q = 1;
while(p<=6){
ok = 1;
if(i-q<0||j-q<0||a[i-q][j-q]!=s[p]){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,5);
p =1;q = 1;
while(p<=6){
ok = 1;
if(i+q>=n||j-q<0||a[i+q][j-q]!=s[p]){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,6);
p =1;q = 1;
while(p<=6){
ok = 1;
if(i-q<0||j+q>=n||a[i-q][j+q]!=s[p]){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,7);
p =1;q = 1;
while(p<=6){
ok = 1;
if(i+q>=n||j+q>=n||a[i+q][j+q]!=s[p]){ok = 0;break;}
p++;q++;
}
if(ok) mark(i,j,8);
}
}
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
if(v[i][j]) cout<<a[i][j];
else cout<<'*';
}
cout<<endl;
}
return 0;
}