洛谷1605 迷宫 解题报告

洛谷1605 迷宫

本题地址: http://www.luogu.org/problem/show?pid=1605

题目背景

迷宫 【问题描述】 给定一个N*M方格的迷宫,迷宫里有T处障碍,障碍处不可通过。给定起点坐标和 终点坐标,问: 每个方格最多经过1次,有多少种从起点坐标到终点坐标的方案。在迷宫 中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 输入样例 输出样例 【数据规模】 1≤N,M≤5

题目描述

输入输出格式

输入格式:

【输入】
第一行N、M和T,N为行,M为列,T为障碍总数。第二行起点坐标SX,SY,终点
坐标FX,FY。接下来T行,每行为障碍点的坐标。

输出格式:

【输出】
给定起点坐标和终点坐标,问每个方格最多经过1次,从起点坐标到终点坐标的方
案总数。

输入输出样例

输入样例#1:

2 2 1
1 1 2 2
1 2

输出样例#1:

1

题解

深搜DFS

纯回溯题。

先把障碍标记好,然后从起点开始,往下DFS,当遇到障碍或走到边界时,返回上一层,继续往另一个方向走。

当到达终点时,将方案数+1,继续过程,直到结束。

PS:

DFS就是这样一种走不通就掉头的搜索模式。虽然比较耗时,但在缺乏有效方法是,DFS也不失为一种选择。

搜索也是一种很万能的解题方法,好多题都可以用它来解决(虽然不一定是最优方案)。

下面附上代码。

代码

  1. program d1;    
  2. var    
  3. a,d:array[1..1000,1..1000] of longint;    
  4. b,c:array[1..4] of longint;    
  5. n,m,l,p,x,y,f,k,i:longint;    
  6. procedure sou(x,y:longint);           //深搜    
  7. var    
  8. i:longint;    
  9. begin    
  10. if a[x,y]=then begin     
  11.     f:=f+1;    
  12.     exit;    
  13. end;    
  14. for i:=to do    
  15.     if (x+b[i]>0) and (x+b[i]<=n) and (y+c[i]>0) and (y+c[i]<=m) and (a[x+b[i],y+c[i]]<>2) and (d[x+b[i],y+c[i]]<>1)then begin    
  16.         d[x+b[i],y+c[i]]:=1;    
  17.     sou(x+b[i],y+c[i]);    
  18.         d[x+b[i],y+c[i]]:=0;    
  19.     end;    
  20. end;    
  21. begin    
  22. readln(n,m,k);    
  23. readln(x,y,l,p);    
  24. a[l,p]:=1;    
  25. for i:=to k do    
  26.     begin    
  27.     read(l,p);    
  28. a[l,p]:=2;    
  29. end;    
  30. b[1]:=1;    
  31. c[1]:=0;    
  32. b[2]:=0;    
  33. c[2]:=1;    
  34. b[3]:=-1;    
  35. c[3]:=0;    
  36. b[4]:=0;    
  37. c[4]:=-1;   //方位    
  38. d[x,y]:=1;   //初始化    
  39. sou(x,y);    
  40. write(f);    
  41. end.    

(本文系笔者原创,未经允许不得转载)

原文地址:https://www.cnblogs.com/yzm10/p/4751983.html