Advertisement

P1605 迷宫 题解(dfs 深度优先搜索)

阅读量:

P1605 迷宫

  • 题目
  • 分析
  • 代码
  • 传送门

题目

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

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

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

输入输出样例
输入

复制代码
    2 2 1
    1 1 2 2
    1 2

输出

复制代码
    1

【数据规模】
1≤N,M≤5

分析

非常简单的一道迷宫题,用一个数组去记录经过的路径,障碍物可以当作已经走过的路,剩下的就是基本的dfs模板了,具体细节请看代码注释哦~

代码

复制代码
    //1605
    #include<iostream>
    using namespace std;
     
    typedef struct{
    int x,y;
    }Site;
     
    int n,m,t;
    Site s,f;
    int a[30][30];
    int d[4][2] = {{1,0},{-1,0},{0,1},{0,-1}} ;
    int ans;
     
    void dfs(Site ss){
    	if(ss.x == f.x && ss.y == f.y){ //到达终点方案数增加
    		ans++;
    		return;
    	}
    	
    	for(int i = 0;i< 4;i++){ //每一个点有4个方向,即4种选择
    		Site sss = ss; //下一个节点坐标
    		sss.x += d[i][0];
    		sss.y += d[i][1];
    		
    		if(sss.x <= 0 || sss.x > n || sss.y <= 0 || sss.y > m || a[sss.x][sss.y]){ // 边界判定及路径判定
    			continue;
    		}else {
    			a[sss.x][sss.y] = 1;
    			dfs(sss);
    			a[sss.x][sss.y] = 0; //恢复状态
    		}
    	}	
    }
     
    int main(){
    	cin>>n>>m>>t;
    	cin>>s.x>>s.y>>f.x>>f.y;	
     	for(int i = 0;i < t;i++){
     		Site b;
     		cin>>b.x>>b.y;
     		a[b.x][b.y] = 1;
    	}
    	
    	a[s.x][s.y] = 1; //起点只能走一次
    	dfs(s);
     	
     	cout<<ans<<endl;
     	
     	return 0;
    }

传送门

P1605

全部评论 (0)

还没有任何评论哟~