洛谷 P1605 迷宫

题目背景题目链接

  题目描述

  给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。

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

  给定起点坐标和终点坐标,每个方格最多经过一次,问有多少种从起点坐标到终点坐标的方案。

  输入格式

  第一行为三个正整数 N,M,T,分别表示迷宫的长宽和障碍总数。

  第二行为四个正整数 SX,SY,FX,FY,SX,SY代表起点坐标,FX,FY代表终点坐标。

  接下来 $T$ 行,每行两个正整数,表示障碍点的坐标。

  输出格式

  输出从起点坐标到终点坐标的方案总数。

  样例输入                                     样例输出

   2 2 1                                                         1
   1 1 2 2
   1 2

题解

  解题思路

    经典的DFS+回溯题目,从起点向四周递归搜索,遇到边界,障碍或走过的路就回溯一步改变方向继续搜索,统计最终到达终点的次数(几道类似的题目:P1141P1238)。详细思路见代码。

 1 #include<bits/stdc++.h>//万能头文件
 2 using namespace std;
 3 int a,b,c,d;
 4 int ans;
 5 int z[101][101];
 6 int zx,zy;
 7 int n,m,t;
 8 void dfs(int p,int q)
 9 {
10     if(p==c&&q==d)
11     {
12         ans++;
13         return;
14     }//如果到达终点,就回到上一层
15     z[p][q]=0;
16     if(z[p][q+1]!=0)
17     {
18         dfs(p,q+1);
19         z[p][q+1]=1;
20     }//如果右边可以走,就走
21     if(z[p][q-1]!=0)
22     {
23         dfs(p,q-1);
24         z[p][q-1]=1;
25     }//走左边
26     if(z[p-1][q]!=0)
27     {
28         dfs(p-1,q);
29         z[p-1][q]=1;
30     }//走上边
31     if(z[p+1][q]!=0)
32     {    
33         dfs(p+1,q);
34         z[p+1][q]=1;
35     }//走下边
36 }
37 int main()
38 {
39     memset(z,0,sizeof(z));//将z数组全部赋值为0
40     
41     cin>>n>>m>>t;//输入迷宫的长、宽以及障碍的数量
42     cin>>a>>b>>c>>d;//(a,b)为起点坐标,(c,d)为终点坐标
43     
44     for(int i=1;i<=n;i++)
45         for(int j=1;j<=m;j++)
46             z[i][j]=1;//将迷宫区域全部赋值1,代表可以走
47     for(int i=1;i<=t;i++)
48     {
49         cin>>zx>>zy;//输入障碍的坐标
50         z[zx][zy]=0;//将障碍的坐标赋值为0,代表不可以走
51     }
52     dfs(a,b);//进行深搜
53     cout<<ans<<endl;输出路的数量
54     return 0;//完结撒花
55 }//提交记录
posted @ 2023-01-31 14:10  yczzws  阅读(114)  评论(0编辑  收藏  举报