照例还是题目链接:https://www.luogu.org/problemnew/show/P1101
这题跟以往的DFS不同的是,它是单向的DFS(因为我做题少,所以第一次见到这种类型的题目)。
思路很简单,但是对于第一次做这种单向DFS的我来说(我蒻),开始确实感觉无从下手。
这道题目和以往的DFS不同的地方在于,DFS的方向是在外面判断的,然后还要记录路径,路径记录全了才能往vis里面加true。
直接看代码吧,这道题应该只有我才会不做了。
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
const int maxn = 110;
char G[maxn][maxn];
int vis[maxn][maxn];
int dx[]={0,1,-1,0,1,-1,1,-1};
int dy[]={1,0,0,-1,1,-1,-1,1};
map<char,char> mp;
int n;
struct node
{
int x;
int y;
}c[maxn];
void init()
{
memset(G,'0',sizeof(G));
memset(vis,0,sizeof(vis));
mp['y'] = 'i';
mp['i'] = 'z';
mp['z'] = 'h';
mp['h'] = 'o';
mp['o'] = 'n';
mp['n'] = 'g';
}
void dfs(int x,int y,int k,int stp)
{
if(stp==7)
{
for(int i=0;i<7;i++)
{
vis[c[i].x][c[i].y] = 1;
}
return;
}
int nowx = x+dx[k];
int nowy = y+dy[k];
if(nowx>=1 && nowx<=n && nowy>=1 && nowy<=n)
{
if(stp==6 || G[nowx][nowy]==mp[G[x][y]])
{
c[stp].x = nowx;
c[stp].y = nowy;
dfs(nowx,nowy,k,stp+1);
}
}
}
int main()
{
while(cin>>n)
{
init();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>G[i][j];
if(G[i][j]=='y' || G[i][j]=='i' || G[i][j]=='z' || G[i][j]=='h' || G[i][j]=='o' || G[i][j]=='n' || G[i][j]=='g')
{
G[i][j] = G[i][j];
}
else
{
G[i][j] = '*';
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(G[i][j]=='y')
{
for(int k=0;k<8;k++)
{
c[0].x = i;
c[0].y = j;
dfs(i,j,k,1);
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(vis[i][j])
{
cout<<G[i][j];
}
else
{
cout<<"*";
}
}
cout<<endl;
}
cout<<endl;
}
return 0;
}
PS:今天写了好几篇题解,感觉今天做的题全部都是我无从下手的,今天真是收获满满的一天。
PS:确实写题解可以帮助理解代码。空想是不行的啊!