单向DFS【洛谷P1101】

照例还是题目链接: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:确实写题解可以帮助理解代码。空想是不行的啊!

猜你喜欢

转载自blog.csdn.net/KIKO_caoyue/article/details/83116762