【搜索1】P1605 迷宫

题目背景

迷宫 【问题描述】

给定一个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



题目思路:
1.用2个数组dx[4],dy[4]的组合表示上下左右四个方向,
2.搜索:从第一个节点开始,依次从它的上,下,左,右,方向开始搜索。如果第一次上可以走到s2,又对s2这个节点进行上下左右的搜索,直到四个方向都走不通,回到上一个节点。在此之中,如果到达了终点则总的次数加1.
3.终点:第一个节点的所有方向的路径都被试探过则结束。

伪代码模板:
dfs(int k){
  if(已经到达这个点){
    路径数+1;
  for(四个方向都要遍历){
    if(可以向下走){
      先标记下一个方向d(k+1)被走过;
      dfs(下一个点);
      恢复下一个方向d(k+1);//因为在dfs遍历完一个方向后,应该继续遍历当前节点的其他方向
      }
    }
}
实现代码:
 1   
 2 #include<iostream>
 3 using namespace std;
 4 int a[100][100];
 5 int n,m,f, x0,y0,x1,y1;
 6 int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
 7 int s=0;
 8 void dfs(int x,int y){
 9     if(x==x1&&y==y1){
10         s++;
11         return ;
12     }
13     for(int i=0;i<=3;i++){
14         int z=x+dx[i];
15         int w=y+dy[i];
16     //    cout<<"i"<<i<<endl;
17         if(a[z][w]==0&& z<=n&&z>=1 &&w<=m && w>=1){
18             a[z][w]=1;
19     //        cout<<z<<"  "<<w<<endl;
20             dfs(z,w);
21             a[z][w]=0;
22         }
23     }
24     
25     
26     
27     
28 }
29 int main(){
30 
31     cin>>n>>m>>f;//行列
32     int i,j;
33     
34     for(i=1;i<=n;i++){
35         for(j=1;j<=m;j++){
36             a[i][j]=0;
37         }
38     }
39 
40     cin>>x0>>y0>>x1>>y1;
41     a[x0][y0]=1;
42     int x2,y2;
43     while(f--){
44         cin>>x2>>y2;
45         a[x2][y2]=1;
46     }
47     dfs(x0,y0);
48      
49     cout<<s<<endl;
50     
51     return 0;
52 }
53   
View Code

 


posted @ 2018-12-03 13:43  一头  阅读(269)  评论(0编辑  收藏  举报