DFS及洛谷P1605迷宫题解

意识到自己很菜已经很久了,今天终于下定决心要把DFS跟BFS好好学一下。虽然已经决定走游戏开发的道路了,但是无论如何,算法都是不能落下的一课。

关于BFS跟DFS的定义,网上已经有很多非常详细的解法了,这里也就不在啰嗦。下面看例题,是洛谷的P1605。上题目。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5q2m55Sw5pm05rW3,size_20,color_FFFFFF,t_70,g_se,x_16

 

首先题目是非常经典的迷宫例题,唯一的不同在于,要求每个位置都必须只走一遍。很容易想到用dfs搜索,如果达到终点,那么就把方案总和++。同时我们需要确认当前每一个位置的状态,如果当前位置已经被遍历,那么我们需要把当前位置做好标记,同时需要回溯到最初的状态,来寻找新的路径。

代码如下: 

#include<bits/stdc++.h>
using namespace std;

int s[10][10],v[10][10];
int n,m,t,startx,starty,endx,endy,sum=0;
int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
void dfs(int x,int y){
	if(x==endx&&y==endy){
		sum++;
		return;
	}
	else{
	for(int i=0;i<4;i++){
		int tempx=x+dx[i];
		int tempy=y+dy[i];
		if(s[tempx][tempy]==1&&v[tempx][tempy]==0){
			v[tempx][tempy]=1;
			dfs(tempx,tempy);
			v[tempx][tempy]=0;
		}
	}
    }
    return;
}
int main(void){
	scanf("%d%d%d",&n,&m,&t);
	scanf("%d%d%d%d",&startx,&starty,&endx,&endy);
	v[startx][stary]=1;
	for(int i=1;i<=n;i++)
	   for(int j=1;j<=m;j++)
	      s[i][j]=1;
	for(int i=1;i<=t;i++){
		int x,y;
		scanf("%d%d",&x,&y);
		s[x][y]=0;
	}
	dfs(startx,starty);
	printf("%d",sum);
	return 0;
}

用dx跟dy数组来确定方向,在深搜的同时标记状态即可,然后回溯状态,寻找新的路径。

值得注意的一个细节是,我们这样的dfs,会导致有一个地方没有被标记,并且在回溯过程中如果再次搜索到这个位置,你的答案可能就是标准答案的两倍。这个位置就是起点。

所以在一开始,我们就需要把起点的位置标记为已走过。

也是这个问题,导致我在第一次提交的时候只有70分,改了之后才拿到满分。hhh,下次注意。

然后后续应该会更一篇关于我参加吉比特高校游戏开发大赛的作品文,初步确认作品为2d的推箱子解谜类混时空小游戏,提交作品之后,我会更新总结自己的第一次参赛经历,希望能跟大家一起进步!干巴爹! 

猜你喜欢

转载自blog.csdn.net/qq_62440805/article/details/123944898