迷宫题解 题目ID:8015

题目描述

时间限制: 1s 空间限制:32M
题目描述:

给定一个N∗M 方格的迷宫,每个方格最多经过一次,且迷宫里有 T 处障碍,障碍处不可通过。

在迷宫中有上下左右四种移动方式,每次只能移动一个方格的距离。数据保证起点上没有障碍。

给定起点坐标和终点坐标,问: 有多少种从起点坐标到终点坐标的行走方案。

输入格式:

第一行有三个整数:N,M,T。N 为行数,M 为列数,T 为障碍总数。(1≤N,M≤5)

第二行有起点坐标 SX,SY 和终点坐标 FX,FY。

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

输出格式:

从起点到终点的行走方案总数。

样例输入1:

2 2 1
1 1 2 2
1 2

样例输出1:

1

这题
几乎是一道DFS模板题目
首先
我们有一个起点一个终点,有T个障碍的坐标,让我们找走到终点的路有几条
那我们只需构建一个N*M的图,在图上标注障碍,起点和终点,然后BFS找路即可,一边BFS一边记录一个总数ans,最后输出即可。

头文件纯属我的喜好

#include <cassert>
#include <cctype>
#include <cerrno>
#include <cfloat>
#include <ciso646>
#include <climits>
#include <clocale>
#include <cmath>
#include <csetjmp>
#include <csignal>
#include <cstdarg>
#include <cstddef>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <ccomplex>
#include <cfenv>
#include <cinttypes>
#include <cstdalign>
#include <cstdbool>
#include <cstdint>
#include <ctgmath>
#include <cwchar>
#include <cwctype>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <exception>
#include <fstream>
#include <functional>
#include <iomanip>
#include <ios>
#include <iosfwd>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <locale>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <stdexcept>
#include <streambuf>
#include <string>
#include <typeinfo>
#include <utility>
#include <valarray>
#include <vector>
#include <array>
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <forward_list>
#include <future>
#include <initializer_list>
#include <mutex>
#include <random>
#include <ratio>
#include <regex>
#include <scoped_allocator>
#include <system_error>
#include <thread>
#include <tuple>
#include <typeindex>
#include <type_traits>
#include <unordered_map>
#include <unordered_set>
#define int long long//图方便
using namespace std;
int m, n, t, ans, fx, fy, xs, ys;
bool vis[105][105];
int mp[105][105];
int px[] = { 0,0,1,-1 };//4个可以走的点的坐标
int py[] = { 1,-1,0,0 };
void dfs(int x, int y)
{
	if (如果到了终点)
	{
		数量++;
		return;
	}
	for (int i = 0; i <= 3; i++)
	{
		int cx = x + px[i];
		int cy = y + py[i];
		if (判断越界和是否被标记)
		{
			continue;
		}
		vis[cx][cy] = 1;//标记
		dfs(搜下去);
		vis[cx][cy] = 0;//这里求的是总数所以一定要回溯!
	}
}
signed main()//前面用了define这里要改
{
	cin >> n >> m >> t;
	cin >> xs >> ys >> fx >> fy;
	for (int i = 1; i <= t; i++)
	{
		int u, v;
		cin >> u >> v;
	    建图
	}
	先给起点标记上
	dfs(开始DFS原点);
	cout << ans;//输出总数
	return 0;
}
  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值