洛谷P1605 迷宫 (DFS)

题目背景

迷宫 【问题描述】

给定一个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 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 using namespace std;
 5 char a[35][35];
 6 int n,m,t;
 7 int res=0;
 8 int dx[4]={1,-1,0,0};
 9 int dy[4]={0,0,1,-1};
10 int sx,sy,ex,ey;
11 void dfs(int x,int y)
12 {
13     if(x==ex-1&&y==ey-1) {
14         res++;
15         return;
16     }
17     for(int i=0;i<4;i++){
18         int nx=x+dx[i],ny=y+dy[i];
19         if(nx>=0&&nx<n&&ny>=0&&ny<m&&a[nx][ny]=='.'){
20             a[x][y]='#';
21             dfs(nx,ny);
22             a[x][y]='.';
23         }
24     }
25     return ;
26 }
27 int main()
28 {
29     while(cin>>m>>n>>t){
30         for(int i=0;i<n;i++){
31             for(int j=0;j<m;j++){
32                 a[i][j]='.';
33             }
34         } 
35         cin>>sx>>sy>>ex>>ey;
36         while(t--){
37             int x,y;
38             cin>>x>>y;
39             a[x-1][y-1]='#';
40         }
41         a[sx-1][sy-1]='#';
42         dfs(sx-1,sy-1);
43         cout<<res<<endl;
44     } 
45     return 0;
46 }

 

posted @ 2019-03-19 20:41  wydxry  阅读(487)  评论(0编辑  收藏  举报
Live2D