DFS(单词方阵)
思路:
先把地图二维字符数组存进去之后,遍历寻找到一个‘y’,然后我们可以设置一个八个方向的方向数组,让‘y’的坐标,遍历加上方向坐标,找到’i‘然后沿着这个方向,dfs下去,每次寻找到正确的,然后建立一个结构体存下点的坐标,然后设置bool数组标记坐标位置,最后再遍历输出,当bool数组为true时,正常输出,当bool数组为false时,输出’*‘。
代码如下:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100+10;
struct node{
int x,y;
}c[N];
char mp[N][N],stand[]="yizhong";
int vis[N][N];
int dir[][2]={{-1,-1},{-1,0},{-1,1},{0,-1},{0,1},{1,-1},{1,0},{1,1}};
void dfs(int x,int y,node c[],int k,int cur)
{
if(cur==7)
{
for(int i=0;i<7;i++)
vis[c[i].x][c[i].y]=1;
}
else
{
int dx=x+dir[k][0];
int dy=y+dir[k][1];
if(cur==6||mp[dx][dy]==stand[cur+1])
{
c[cur].x=x;
c[cur].y=y;
dfs(dx,dy,c,k,cur+1);
}
}
}
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++)
{
scanf("%s",mp[i]);
}
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(mp[i][j]=='y')
{
for(int k=0;k<8;k++)
{
int x=i+dir[k][0];
int y=j+dir[k][1];
if(mp[x][y]=='i')
{
dfs(i,j,c,k,0);
}
}
}
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(vis[i][j]==1)
printf("%c",mp[i][j]);
else
printf("*");
}
printf("\n");
}
return 0;
}