迷宫[搜索]

题目描述

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

输入格式

第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点坐标FX,FY。接下来T行,每行为障碍点的坐标。

输出格式

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

输入输出样例

输入

2 2 1
1 1 2 2
1 2

输出

1

说明/提示
【数据规模】
1≤N,M≤5

普通的模拟搜索,每走一步标记一个点,搜完回溯时记得回复原状态
不想判读>n,<0这种情况的话,就把周围全标记成障碍,当标记数组标记为可走就直接搜就行,
到中点记录答案就退出。
本来不想写这题的博客的,
但是交的时候第一次是70分在这里插入图片描述
于是去翻了翻题解看都一个细节:搜的时候要先把起点标记为不可走
所以写了这篇博客提醒一下自己。
不过题解说没有标记原点40分,但是我70?
在这里插入图片描述
不管了,要注意细节吖

#include

#define ll long long
#define MAXN 5000100
#define N 1001
#define INF 0x3f3f3f3f
#define gtc() getchar()

using namespace std;

template <class T>
inline void read(T &s){
	s = 0; T w = 1, ch = gtc();
	while(!isdigit(ch)){if(ch == '-') w = -1; ch = gtc();}
	while(isdigit(ch)){s = s * 10 + ch - '0'; ch = gtc();}
	s *= w;
} 

template <class T>
inline void write(T x){
    if(x < 0) putchar('-'), x = -x;
	if(x > 9) write(x/10);
    putchar(x % 10 + '0');
}

int a[10][10];
int n, m, t;
int sx, sy, ex, ey;

int dx[5] = {0, 1, -1, 0, 0};
int dy[5] = {0, 0, 0, 1, -1};

int ans = 0;
void dfs(int x, int y){
	if(x == ex && y == ey){
		++ans; return ;
	}
	
	for(int i = 1; i <= 4; ++i){
		int xx = x + dx[i], yy = y + dy[i];
		if(a[xx][yy] != 0) continue;
		a[xx][yy] = 1;
		dfs(xx, yy);
		a[xx][yy] = 0;
	}
}
int main()
{
	memset(a, -1, sizeof(a));
	read(n), read(m), read(t);
	read(sx), read(sy), read(ex), read(ey);

	for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= m; ++j) 
			a[i][j] = 0;
			
	for(int i = 1; i <= t; ++i){
		int x, y;
		read(x), read(y);
		a[x][y] = -1;
	}
	
	a[sx][sy] = 1;
	dfs(sx, sy);
	
	cout << ans << endl;
	return 0;
}

你可能感兴趣的:(搜索)