迷宫-dfs

久未见 提交于 2020-01-22 00:37:20

题目描述

给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 

1≤N,M≤5

 

输入

第一行起点坐标SX,SY,终点坐标FX,FY。

第二行N、M和T,N为行,M为列,T为障碍总数。

接下来T行,每行为障碍点的坐标。

 

输出

给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方案总数。

 

样例输入

1 1 2 2
2 2 1
1 2

 

样例输出

1

题解:

巨简单的DFS,模板题,数据也很小

#include <bits/stdc++.h>
#define MAXN 20
using namespace std;
int rub[MAXN][MAXN];
int vis[MAXN][MAXN];
int n, m, t, bx, by, ex, ey;
int ans = 0;
int zb[4][2] = {{0,-1},{0,1},{1,0},{-1,0}};
void dfs(int x,int y)
{
	if(x == ex && y == ey) { ans++;return; }
	else
		for(int i = 0 ; i < 4; ++i)
			if(x >= 1 && x <= n && y >= 1 && y <= m && rub[x + zb[i][0]][y + zb[i][1]] == 0 && vis[x + zb[i][0]][y + zb[i][1]] == 0)
			{
				vis[x][y] = 1;
				dfs(x + zb[i][0],y + zb[i][1]);
				vis[x][y] = 0;
			}
	return;
}
int main()
{
	scanf("%d%d%d%d",&bx,&by,&ex,&ey);
	scanf("%d%d%d",&n,&m,&t);
	for(int i = 1; i <= t ; ++i)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		rub[x][y] = 1;
	}   
	dfs(bx,by);
	printf("%d\n",ans);
	return 0;
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!