ACM-寻宝

本文介绍了一个寻宝游戏的问题解决方法,通过深度优先搜索(DFS)算法来判断玩家是否能够从起点出发,经过所有可用路径一次且仅一次地到达每一个宝藏点。文章提供了完整的C++代码实现,并强调了正确初始化的重要性。
题目描述:寻宝

有这么一块神奇的矩形土地,为什么神奇呢?因为上面藏有很多的宝藏。该土地由N*M个小正方形土地格子组成,每个小正方形土地格子上,如果标有“E”,则表示该格可以通过;如果标有“X”,则表示该格不能通过。现在你处于其中的一格上,用“P”表示,你只能向与你所在格子相邻的上、下、左、右四个方向移动,当然如果你即将移向的格子上标有“X”,则不能通过。现在的任务是:如果你能从起点通过每个用“E”标示的格子一次且仅一次,则你将寻宝成功,否则则失败。

输入

输入包括如下几部分。 第一部分:输入两个数N(1<=N<=6)和M(1<=M<=6),分别表示该土地的行和列。 第二部分:输入一个只能由“P”、“X”、“E”构成的N*M大小的矩阵,且“P”只能出现一次,代表你当前所在位置。

输出

如果能寻宝成功,输出“YES”;否则输出“NO”。

样例输入
2 2
PE
ES

4 4
PXEE
EXEE
EEEE
EEEE
样例输出
NO
YES

思路:简单的DFS。
之前总是AC不正确是因为初始化只在程序进入的时候初始化了一次,后面没有所以结果错了,下次记得初始化!!!!!
// 寻宝.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"



//没有AC的原因是flag只是初始化了一次!!!!!
#include <iostream>
#include <cstring>
using namespace std;

int n, m, num,sr,sl, flag, vis[10][10], dir[4][2] = { 1, 0, -1, 0, 0, 1, 0, -1 };
char map[10][10];

void DFS(int x, int y, int step)
{
    if (step == num) { flag = 1; return; }
    
    if (flag) return;

    for (int i = 0; i < 4; i++)
    {
        int nx = dir[i][0] + x;
        int ny = dir[i][1] + y;
        if (nx >= 0 && ny >= 0 && nx < n && ny < m && !vis[nx][ny] && map[nx][ny]=='E')
        {
            vis[x][y] = 1;
            DFS(nx, ny, step + 1);
            vis[x][y] = 0;
        }
    }
}

int main()
{
    while (cin>>n>>m)
    {

        memset(vis, 0, sizeof(vis));
        memset(map, '\0', sizeof(map));        
        num = 0;
        flag = 0;

        for (int i = 0; i < n; i++)
            cin >> map[i];

        for (int i = 0; i < n; i++)
        {    
            for (int j = 0; j < m; j++)
            {
                if (map[i][j] == 'E')
                    num++;
                else if (map[i][j] == 'P')
                {
                    sr = i;
                    sl = j;
                }
            }
        }

        vis[sr][sl] = 1;
        DFS(sr, sl, 0);

        if (flag) cout << "YES" << endl;
        else cout << "NO" << endl;

    }

    return 0;
}

 

 
 

转载于:https://www.cnblogs.com/x739400043/p/8541531.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值