走迷宫

Think:
很裸的DFS题~~~
所以直接上DFS了, 用一个flag来标记是否存在输出。
MAP数组用来储存, vis用来标记是否访问过。
然后changX changY 两个数组表示每次点的变化方向。
变换后记住判断是否越界。
每次遍历 DFS(tx, ty)

Problem Description
有一个m*n格的迷宫(表示有m行、n列),其中有可走的也有不可走的,如果用1表示可以走,0表示不可以走,输入这m*n个数据和起始点、结束点(起始点和结束点都是用两个数据来描述的,分别表示这个点的行号和列号)。现在要你编程找出所有可行的道路,要求所走的路中没有重复的点,走时只能是上下左右四个方向。如果一条路都不可行,则输出相应信息(用-1表示无路)。
Input
第一行是两个数m,n(1< m, n< 15),接下来是m行n列由1和0组成的数据,最后两行是起始点和结束点。
Output
所有可行的路径,输出时按照左上右下的顺序。描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示。如果没有一条可行的路则输出-1。
Example Input

5 4
1 1 0 0
1 1 1 1
0 1 1 0
1 1 0 1
1 1 1 1
1 1
5 4

Example Output

(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(1,2)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
(1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(1,2)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(4,1)->(5,1)->(5,2)->(5,3)->(5,4)
(1,1)->(2,1)->(2,2)->(3,2)->(4,2)->(5,2)->(5,3)->(5,4)

#include<bits/stdc++.h>
using namespace std;
struct node
{
    int x;
    int y;
} a[1050];

int x, y, X, Y;
int n, m;
int step;
bool flag;
bool vis[1050][1050];
int MAP[1050][1050];
int changX[] = {0, -1, 0, 1};
int changY[] = {-1, 0, 1, 0};

void DFS(int x1, int y1);

int main()
{
    int i, j;
    while(~scanf("%d %d",&n,&m))
    {
        memset(vis, false, sizeof(a));
        memset(MAP, 0, sizeof(MAP));
        for (i = 1; i <= n; i ++)
            for (j = 1; j <= m; j ++)
                scanf("%d", &MAP[i][j]);
        scanf("%d %d", &x, &y);
        scanf("%d %d", &X, &Y);
        a[0].x = x;
        a[0].y = y;
        flag = false;
        vis[x][y] = true;
        step = 1;
        DFS(x, y);
        if (flag == false)
            printf("-1\n");
    }
    return 0;
}

void DFS(int x1, int y1)
{
    int i;
    if (x1 == X && y1 == Y)
    {
        flag = true;
        for (i = 0; i <= step - 1; i ++)
        {
            printf("(%d,%d)",a[i].x, a[i].y);
            if (i < step - 1)
                printf("->");
        }
        printf("\n");
    }
    else
    {
        int tx, ty;
        for (i = 0; i <= 4 - 1; i ++)
        {
            tx = x1 + changX[i];
            ty = y1 + changY[i];
            if (tx < 0 || tx > n || ty < 0 || ty > m)
            continue;
            if (MAP[tx][ty] == 1 && vis[tx][ty] == false)
            {
                a[step].x = tx;
                a[step].y = ty;
                step ++;
                vis[tx][ty] = true;
                DFS(tx, ty);
                vis[tx][ty] = false;
                step --;
            }
        }
    }
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值