zoukankan      html  css  js  c++  java
  • ACM-寻宝

    题目描述:寻宝

    有这么一块神奇的矩形土地,为什么神奇呢?因为上面藏有很多的宝藏。该土地由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, '', 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;
    }
     
     
  • 相关阅读:
    CentOS挂载NTFS移动硬盘
    【算法与数据结构】动态规划
    【算法与数据结构】图的最小生成树 MST
    【C语言工具】AddressSanitizer
    【算法与数据结构】二叉堆和优先队列 Priority Queue
    【算法与数据结构】三种简单排序
    【算法与数据结构】并查集 Disjoint Set
    【算法与数据结构】二叉堆和堆排序
    【Linux 应用编程】进程管理
    【Linux 应用编程】进程管理
  • 原文地址:https://www.cnblogs.com/x739400043/p/8541531.html
Copyright © 2011-2022 走看看