这道题可以用dfs回溯来做,难点是沿着同一方向摆放。
所以我想的是,如果是’y’那么就沿着四面八方搜索,确定方向,然后每一次就按照这个固定的方向。
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
char a[maxn][maxn],s[10]={'0','y','i','z','h','o','n','g'};
int n,dx[10]={0,0,1,1,1,0,-1,-1,-1},dy[10]={0,1,1,0,-1,-1,-1,0,1};
bool ok1[maxn][maxn],ok2[maxn][maxn];
void dfs(int k,int x,int y,int p){
if(k==7){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(ok1[i][j]) ok2[i][j]=true;
}
return;
}
ok1[x][y]=true;
if(p==0){
for(int i=1;i<=8;i++){
int tx=x+dx[i],ty=y+dy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]==s[k+1]){
ok1[tx][ty]=true;
dfs(k+1,tx,ty,i);
ok1[tx][ty]=false;
}
}
}
else{
int tx=x+dx[p],ty=y+dy[p];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]==s[k+1]){
ok1[tx][ty]=true;
dfs(k+1,tx,ty,p);
ok1[tx][ty]=false;
}
}
ok1[x][y]=false;
}
int main(){
scanf("%d",&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')
dfs(1,i,j,0);
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(ok2[i][j])cout<<a[i][j];
else printf("*");
}
cout<<endl;
}
}
原理相同,下面的可能更好看一些
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+10;
char a[maxn][maxn],s[10]={'0','y','i','z','h','o','n','g'};
int n,dx[10]={0,0,1,1,1,0,-1,-1,-1},dy[10]={0,1,1,0,-1,-1,-1,0,1};
bool ok1[maxn][maxn],ok2[maxn][maxn];
void dfs(int k,int x,int y,int p){
if(k==7){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++){
if(ok1[i][j]) ok2[i][j]=true;
}
return;
}
int tx=x+dx[p],ty=y+dy[p];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]==s[k+1]){
ok1[tx][ty]=true;
dfs(k+1,tx,ty,p);
ok1[tx][ty]=false;
}
}
int main(){
scanf("%d",&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')
for(int k=1;k<=8;k++){
ok1[i][j]=true;
dfs(1,i,j,k);
ok1[i][j]=false;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(ok2[i][j])cout<<a[i][j];
else printf("*");
}
cout<<endl;
}
}