杭电1035,dfs入门题(C/C++)

最近在入门搜索的算法,首先要攻下dfs(想到后面还有bfs…)
上网搜了一下DFS入门题有哪些,看到其中一道就是这道;
题目不算难,思路比较直接(但是还是WA了几次…)
题目如下:
杭电1035,dfs入门题(C/C++)_第1张图片
杭电1035,dfs入门题(C/C++)_第2张图片
杭电1035,dfs入门题(C/C++)_第3张图片
注意点:dfs的下一次递归要在当前递归的所有操作完成后再进行,否则出现计算时loop的step为0!
AC代码(含注解):

#include
#include
#include
using namespace std;//DFS用vis数组判断是否已经走过,若走过,则出现环;
char map[15][15];//构造地图; 
int vis[15][15];//用来标记该处是否已经走过; 
int step[15][15];//用来标记走到该处花了多少步; 
int flag,l;//flag表示是成环还是成功走出,l记录成环时环中多少步; 	
int n,m,k;//n行m列,起始位置为第k列;
int f;//记录上一步是步数; 
void dfs(int x,int y)
{
	if(x>=1&&x<=n&&y>=1&&y<=m)//确认在范围内后四个方位按指令遍历; 
	{
		if(map[x][y]=='S'&&vis[x][y]==0)
		{
			vis[x][y]=1;//标记已经走过; 
			f++;
			step[x][y]=f;
			dfs(x+1,y);//必须要在当前状态确认完成后再去执行下一状态操作; 
		}
		else
		if(map[x][y]=='N'&&vis[x][y]==0)
		{
			vis[x][y]=1;
			f++;
			step[x][y]=f;
			dfs(x-1,y);
		}
		else
		if(map[x][y]=='W'&&vis[x][y]==0)
		{
			vis[x][y]=1;
			f++;
			step[x][y]=f;
			dfs(x,y-1);
		}
		else
		if(map[x][y]=='E'&&vis[x][y]==0)
		{
			vis[x][y]=1;
			f++;
			step[x][y]=f;
			dfs(x,y+1);
		}
		else
		if(vis[x][y]==1)
		{
			flag=1;
			f++;
			l=f-step[x][y];
			return ;
		}
	}
	else
	return ;
}
int main()
{
	int i,j;
	while(scanf("%d%d%d",&n,&m,&k)!=EOF)
	{
		
		getchar();//吃掉换行符不然第一个字符就变换行符了! 
		if(n==0&&m==0&&k==0)
		break;
		memset(vis,0,sizeof(vis));
		memset(step,0,sizeof(step));
		f=-1;//因为第一步进入图不算; 
		flag=0;//开始时假设能走出; 
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				scanf("%c",&map[i][j]);
			}
			getchar();//吃换行符; 
	   }
		dfs(1,k);
		 if(!flag)
		 printf("%d step(s) to exit\n",f+1);//出图还有一步,要加一; 
		 else
		 printf("%d step(s) before a loop of %d step(s)\n",f-l,l);
	}
	 return 0;
 } 

坚持,努力!!!

你可能感兴趣的:(算法)