追梦算法----迷宫的路径?

说明

Mitch老鼠在森林里游玩,不小心走进了一个迷宫里面,这个迷宫是一个n行m列的矩阵,迷宫中有些格子是可以走的,有些格子是不能走的,能走的格子用“o”(小写字母o)表示,不能走的格子用“#”表示。

Mitch选择走出迷宫的策略是:先向右,如果右边走不通则选择向下,如果下边走不通则选择向左,如果左边走不通则选择向上;如果四个方向都走不通,则后退选择其他能走的路径。

Mitch从类似下图所示的迷宫的左上角(1,1)点进入迷宫(请注意:入口1,1和出口的n,m点都不是#),请问Mitch有哪些方法可以走出迷宫,走到(n,m)点;请编程求出所有可能的路径,输出这些路径,如果不存在任何的路径可以走出迷宫,请输出“no”。

1

2

3

4

5

1

o

o

o

o

o

2

o

#

#

#

#

3

o

o

o

o

o

4

#

o

o

#

o

5

o

o

o

o

#

6

o

#

o

o

o

输入格式

第一行包含两个整数n和m,中间用单个空格隔开,代表迷宫的行和列的数量。

接下来n行,每行m个字符,描述迷宫地图。字符只有“o”或“#”两种,“o”代表这个格子可以走,“#”代表这个格子不能走。(4 <= n,m <= 10 )

输出格式

请按照Mitch选择的走出迷宫的策略,输出所有可能的路径,输出形式请参考样例输出的形式。

样例

输入数据 1

6 5
ooooo
o####
ooooo
#oo#o
oooo#
o#ooo

Copy

输出数据 1

1:1,1->2,1->3,1->3,2->3,3->4,3->5,3->5,4->6,4->6,5
2:1,1->2,1->3,1->3,2->3,3->4,3->5,3->6,3->6,4->6,5
3:1,1->2,1->3,1->3,2->3,3->4,3->4,2->5,2->5,3->5,4->6,4->6,5
4:1,1->2,1->3,1->3,2->3,3->4,3->4,2->5,2->5,3->6,3->6,4->6,5
5:1,1->2,1->3,1->3,2->4,2->4,3->5,3->5,4->6,4->6,5
6:1,1->2,1->3,1->3,2->4,2->4,3->5,3->6,3->6,4->6,5
7:1,1->2,1->3,1->3,2->4,2->5,2->5,3->5,4->6,4->6,5
8:1,1->2,1->3,1->3,2->4,2->5,2->5,3->6,3->6,4->6,5

dfs模板题

#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <string.h>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
using namespace std;
int n,m,ans=0,vis[15][15],k;
int dx[4]= {0,1,0,-1},dy[4]= {1,0,-1,0};
char a[15][15];
struct ti {
    int start;
    int en;
};
ti b[100];
void dfs(int x,int y,int step) {
    step++;
    b[step].start=x;
    b[step].en=y;
    if(x==n&&y==m) {
        k=1;
        ans++;
        cout<<ans<<":";
        cout<<1<<","<<1;
        for(int i=2; i<=step; i++)
            cout<<"->"<<b[i].start<<","<<b[i].en;
        cout<<endl;
    }

    vis[x][y]=1;
    for(int i=0; i<4; i++) {
        int tx=x+dx[i],ty=y+dy[i];
        if(tx>0&&ty>0&&tx<=n&&ty<=m&&vis[tx][ty]==0&&a[tx][ty]=='o') {
            dfs(tx,ty,step);
        }
    }
    vis[x][y]=0;
}
int main() {
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++) {
            cin>>a[i][j];
        }
    }
    dfs(1,1,0);
    if(!k)
        cout<<"no"<<endl;
    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值