原题
题目描述
给定一个 方格的迷宫,迷宫里有 处障碍,障碍处不可通过。
在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。
给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。
输入格式
第一行为三个正整数 ,分别表示迷宫的长宽和障碍总数。
第二行为四个正整数 , 代表起点坐标, 代表终点坐标。
接下来 行,每行两个正整数,表示障碍点的坐标。
输出格式
输出从起点坐标到终点坐标的方案总数。
样例 #1
样例输入 #1
2 2 1
1 1 2 2
1 2
样例输出 #1
1
提示
对于 的数据,,,,。
题目大意
绕过障碍从 走到 的方案数。
思路
求方案数需要遍历每一条线路,而且可能有一些路会重复走同一个点,所以需要用深搜来实现。
我们用 数组来表示当前点有无被遍历, 数组表示有无障碍,从起点上下左右方向移动,能到终点的路线算一个方案,方案数加一,同时回溯遍历下一条路。
代码实现
#include<bits/stdc++.h>
using namespace std;
const int N=20;//常量边界
int a[N][N],v[N][N];
int n,m,t,ans;
int sx,sy,ex,ey;//sx,sy表起点,ex,ey表终点
int dx[4]={-1,1,0,0},dy[4]={0,0,-1,1};//方向
void dfs(int x,int y)//深搜
{
if(x==ex && y==ey)//到达终点
{
ans++;//小小累加一下方案数
return ;
}
for(int i=0;i<4;i++)//四个方向都遍历一遍
{
int xx=x+dx[i],yy=y+dy[i];
if(xx<=n && xx>=1 && yy<=m && yy>=1 && v[xx][yy]==0 && a[xx][yy]==0)
{//判断xx和yy有没有越界,v[xx][yy]当前位置有没有被遍历过,a[xx][yy]当前位置是不是障碍
v[xx][yy]=1;//标记,表示遍历过
dfs(xx,yy);//从当前位置递归
v[xx][yy]=0;//回溯,为下一个方案做准备
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&t);//小小的读入
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
v[sx][sy]=1;//标记起点被遍历过
for(int i=1;i<=t;i++)
{
int x,y;
scanf("%d%d",&x,&y);//读入障碍
a[x][y]=1;//标记障碍
}
dfs(sx,sy);//从起点开始遍历(不能从(1,1)开始)
printf("%d",ans);//输出,忘了会 WA 声一片
return 0;//好孩几的大好习惯
}
橙题还是挺简单的(求赞)