洛谷题解【迷宫】

【迷宫】

声明

我的码风可能有点和别人不太一样(其实就是有点奇怪),大家重在意会即可

注:此为原洛谷博客的博文

目录

  • 原题转载
  • 前言
  • 代码详解
  • 完整AC代码
  • 后记

原题转载

原题传送门

题目背景

【问题描述】

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

终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫

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

输入样例 输出样例

【数据规模】

1≤N,M≤5

输入输出格式

输入格式:

【输入】

第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点

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

输出格式:

【输出】

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

案总数。

前言

这道题话说是真的水,不过用来练习深搜还是很好的。 这道题十分经典,强烈建议大家自己敲一遍,感受一下这道极其基础的深搜题.

代码详解

为避免繁琐的if语句,先来打个表

const int nextx[4]={0,0,1,-1};
const int nexty[4]={-1,1,0,0};

深搜函数:

void dfs(int x,int y)//深搜 

判断边界:

if(x<1||y<1||x>n||y>m)//如果越界,则返回 
  return;

判断是否到达终点:

if(x==fx&&y==fy)//如果到达终点,则方案数加一 
{
    ans++;
    return;
}

搜索与回溯(重点):

b[x][y]=true;//将当前点标记为已访问 
for(int i=0;i<=3;i++)        
    if(b[x+nextx[i]][y+nexty[i]]==false&&a[x+nextx[i]][y+nexty[i]]==true)//如果未访问且不是障碍物    
        dfs(x+nextx[i],y+nexty[i]);    //则继续深搜 
b[x][y]=false;//回溯 

深搜的完整函数:

 1 void dfs(int x,int y)//深搜 
 2 {
 3     if(x<1||y<1||x>n||y>m)//如果越界,则返回 
 4         return;
 5     if(x==fx&&y==fy)//如果到达终点,则方案数加一 
 6     {
 7         ans++;
 8         return;
 9     }
10     b[x][y]=true;//将当前点标记为已访问 
11     for(int i=0;i<=3;i++)        
12         if(b[x+nextx[i]][y+nexty[i]]==false&&a[x+nextx[i]][y+nexty[i]]==true)//如果未访问且不是障碍物    
13             dfs(x+nextx[i],y+nexty[i]);    //则继续深搜 
14     b[x][y]=false;//回溯 
15 }

完整AC代码

你们最爱的AC代码~~~

 1 #include <iostream>
 2 using namespace std;
 3 bool a[10][10];
 4 bool b[10][10]={0};
 5 int n,m,t,sx,sy,fx,fy,ans=0;
 6 const int nextx[4]={0,0,1,-1};
 7 const int nexty[4]={-1,1,0,0};
 8 
 9 void dfs(int x,int y)//深搜 
10 {
11     if(x<1||y<1||x>n||y>m)//如果越界,则返回 
12         return;
13     if(x==fx&&y==fy)//如果到达终点,则方案数加一 
14     {
15         ans++;
16         return;
17     }
18     b[x][y]=true;//将当前点标记为已访问 
19     for(int i=0;i<=3;i++)        
20         if(b[x+nextx[i]][y+nexty[i]]==false&&a[x+nextx[i]][y+nexty[i]]==true)//如果未访问且不是障碍物    
21             dfs(x+nextx[i],y+nexty[i]);    //则继续深搜 
22     b[x][y]=false;//回溯 
23 }
24 int main()
25 {
26     int tx,ty;
27     cin>>n>>m>>t>>sx>>sy>>fx>>fy;
28     for(int i=1;i<=n;i++)
29         for(int j=1;j<=m;j++)
30             a[i][j]=true;
31     for(int i=1;i<=t;i++)
32     {
33         cin>>tx>>ty;
34         a[tx][ty]=false;
35     }
36     b[sx][sy]=true;
37     dfs(sx,sy);
38     cout<<ans;//输出结果 
39     return 0;
40 }

后记

这道题由于我手残,敲完代码时不小心关了...关了...于是重打一了遍,浪费了不少时间,不过这些都不重要~ ~ ~各位大佬们看到这里,能否给个赞呢?~>_< ~

猜你喜欢

转载自www.cnblogs.com/gongdakai/p/10738904.html