【迷宫】
声明
我的码风可能有点和别人不太一样(其实就是有点奇怪),大家重在意会即可。
注:此为原洛谷博客的博文
目录
- 原题转载
- 前言
- 代码详解
- 完整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 }
后记
这道题由于我手残,敲完代码时不小心关了...关了...于是重打一了遍,浪费了不少时间,不过这些都不重要~ ~ ~各位大佬们看到这里,能否给个赞呢?~>_< ~