草庐IT

c++ - 有没有办法到达最后的盒子 - GRAPH

coder 2024-02-18 原文

存在问题: 第一个人“g”(第一个开始的人)必须到达最后一个盒子“e”,这样第二个人“l”(无论何时)都无法 catch 第一个人。男人可以左、右、上、下或留下。

例如:

Input:
6 7
RRRRRRR
R_e___R
R_____R
R_RRR_R
R_gRl_R
RRRRRRR

答案是"is",因为有路(左、上、上、上、右)。

如何实现这个问题?

我正在使用 BFS 和 DFS。 这是我的代码

#include <iostream>
#include <algorithm>
#include <stack>
#include <math.h>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
const int MAX = 32;
char a[MAX][MAX];
int used[MAX][MAX], m1[MAX][MAX], m2[MAX][MAX];;

int movesx[8] = {-1, 1, 0, 0};
int movesy[8] = { 0, 0, -1, 1};

int n, m, c = 0, flag = 0;

struct pc {
    int x, y;
};

pc li, ga, fi;

queue <pc> q;
void BFS1(pc v) {

    pc from, to;
    memset(m1,0,sizeof(m1)); m1[v.y][v.x] = 0;
    memset(used, 0, sizeof(used));

    q.push(v); used[v.y][v.x] = 1;
    while(!q.empty())
    {
        from = q.front(); q.pop();

        for(int i = 0; i < 4; ++i) {
            int x = from.x + movesy[i], y = from.y + movesx[i];
            if( (a[y][x] == ' ' || a[y][x] == 'g' ) && !used[y][x]) {
                used[y][x] = 1;
                m1[y][x] = m1[from.y][from.x] + 1;
                pc temp;
                temp.x = x;
                temp.y = y;

                q.push(temp);
            }

        }
    }
}

void BFS2(pc v) {

    pc from, to;
    memset(m2,0,sizeof(m2)); m2[v.y][v.x] = 0;
    memset(used, 0, sizeof(used));

    q.push(v); used[v.y][v.x] = 1;
    while(!q.empty())
    {
        from = q.front(); q.pop();

        for(int i = 0; i < 4; ++i) {
            int y = from.y + movesy[i], x = from.x + movesx[i];
            if( (a[y][x] == ' ' || a[y][x] == 'l' ) && !used[y][x]) {
                used[y][x] = 1;
                m2[y][x] = m2[from.y][from.x] + 1;
                pc temp;
                temp.x = x;
                temp.y = y;

                q.push(temp);
            }

        }
    }
}

void DFS(pc v) {
    used[v.y][v.x] = 1;

    for(int i = 0; i < 4; ++i) {

        int x = v.x + movesx[i], y = v.y + movesy[i];

        if(a[y][x] == 'e') {
                c = 1;
                flag = 1;
                return;
        }

        if( (a[y][x] == ' ' ) && !used[y][x] && m2[y][x] < m1[y][x] && flag == 0 ) {
            pc temp;
            temp.x = x;
            temp.y = y;

            DFS(temp);
        }

    }
}

int main() {
        c = 0, flag = 0;
        memset(used, 0, sizeof(used));
        memset(a, 'R', sizeof(a));
        cin >> n >> m;
        string s;
        getline(cin, s);
        for(int i = 0; i < n; ++i) {
            getline(cin, s);
            for(int j = 0; j < m; ++j) {
                a[i][j] = s[j];
                if(a[i][j] == 'g') {
                    ga.x = j;
                    ga.y = i;
                }
                else if(a[i][j] == 'l') {
                    li.x = j;
                    li.y = i;
                }
                else continue;

            }
        }

        BFS1(li);
        BFS2(ga);

        memset(used, 0, sizeof(used));

        DFS(ga);
        if(c == 1) {
            cout << "YES" << endl;
        }
        else {
            cout << "NO" << endl;
        }

}

这是第二个代码:

#include <iostream>
#include <algorithm>
#include <stack>
#include <math.h>
#include <cstring>
#include <map>
#include <queue>
using namespace std;
const int MAX = 32;
char a[MAX][MAX];
int used[MAX][MAX], m1[MAX][MAX], m2[MAX][MAX];;

int an[1002][MAX][MAX];

int movesx[8] = {-1, 1, 0, 0, 0};
int movesy[8] = { 0, 0, -1, 1, 0};

int n, m, c = 0, flag = 0;

struct pc {
    int x, y;
};

pc li, ga;

void functionD() {

    for(int z = 1; z <= 1000; ++z) {
        for(int i = 0; i < n; ++i) {
            for(int j = 0; j < n; ++j) {

                if(an[z - 1][i][j] == 1) {
                    int x, y;
                    for(int k = 0; k < 5; ++k) {

                        x = j + movesx[k];
                        y = i + movesy[k];


                        if(x < m && y < n && x >= 0 && y >= 0) {

                            if(a[y][x] != 'R' && a[y][x] != 'e') {
                                an[z][y][x] = 1;
                            }

                        }

                    }

                }

            }
        }
    }


}

void DFS(pc v, int k) {
    used[v.y][v.x] = 1;

    for(int i = 0; i < 5; ++i) {

        int x = v.x + movesx[i], y = v.y + movesy[i];

        if(a[y][x] == 'e') {
                c = 1;
                flag = 1;
                return;
        }
        if(an[k][y][x] == 0 && a[y][x] != 'R' && !used[y][x] && flag == 0 && k <= 1000) {
            pc temp;
            temp.x = x;
            temp.y = y;
            DFS(temp, k + 1);
        }

    }
}

int main() {
    int nn; cin >> nn;

    for(int z = 0; z < nn; ++z) {
        c = 0, flag = 0;
        memset(used, 0, sizeof(used));
        memset(a, 'R', sizeof(a));
        cin >> n >> m;
        string s;
        getline(cin, s);
        for(int i = 0; i < n; ++i) {
            getline(cin, s);
            for(int j = 0; j < m; ++j) {
                a[i][j] = s[j];
                if(a[i][j] == 'g') {
                    ga.x = j;
                    ga.y = i;
                }
                else if(a[i][j] == 'l') {
                    li.x = j;
                    li.y = i;
                }

            }
        }
        an[0][li.y][li.x] = 1;

        functionD();



        DFS(ga, 1);


        if(c == 1) {
            cout << "YES" << endl;
        }
        else {
            cout << "NO" << endl;
        }

    }
}

编辑(作者 Jarod42):

我找到了一张失败的棘手 map :

9 9
RRRRRRRRR
R...Rg..R
R.RlRRR.R
R.R...R.R
R.RRR.R.R
R.Re....R
R.R.RRR.R
R.......R
RRRRRRRRR

l 无法保护对 e 的两种访问。

或者更简单

RRRRRRRRRR
R...RRRRRR
R.R...RRRR
RlReR...gR
R.R...RRRR
R...RRRRRR
RRRRRRRRRR

最佳答案

您必须首先创建从每次访问到 e 的 map 距离。

然后就是一个minmax(或者alpha-beta):

  • 如果 g 当前位置在一个 map 距离小于 l 当前位置是相同的 map 距离,g 获胜。
  • 如果 l 在所有 map 距离中的距离小于或等于,则 g 输。
  • else g 必须使用其有效 map 之一才能达到目标,l 用其 map (或支架)反击。

(注意:g 没有理由站着,因为 l 可能做同样的事情,我们处于同一点)。

(编辑:注意:在提供的链接中,似乎必须静态选择安全路径,因此动态部分(第 3 个项目符号)对于 g 来说是松散的)

关于c++ - 有没有办法到达最后的盒子 - GRAPH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31854714/

有关c++ - 有没有办法到达最后的盒子 - GRAPH的更多相关文章

  1. ruby - 难道Lua没有和Ruby的method_missing相媲美的东西吗? - 2

    我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/

  2. ruby-on-rails - rails 目前在重启后没有安装 - 2

    我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - 在没有 sass 引擎的情况下使用 sass 颜色函数 - 2

    我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re

  5. 没有类的 Ruby 方法? - 2

    大家好!我想知道Ruby中未使用语法ClassName.method_name调用的方法是如何工作的。我头脑中的一些是puts、print、gets、chomp。可以在不使用点运算符的情况下调用这些方法。为什么是这样?他们来自哪里?我怎样才能看到这些方法的完整列表? 最佳答案 Kernel中的所有方法都可用于Object类的所有对象或从Object派生的任何类。您可以使用Kernel.instance_methods列出它们。 关于没有类的Ruby方法?,我们在StackOverflow

  6. ruby-on-rails - Rails 3,嵌套资源,没有路由匹配 [PUT] - 2

    我真的为这个而疯狂。我一直在搜索答案并尝试我找到的所有内容,包括相关问题和stackoverflow上的答案,但仍然无法正常工作。我正在使用嵌套资源,但无法使表单正常工作。我总是遇到错误,例如没有路线匹配[PUT]"/galleries/1/photos"表格在这里:/galleries/1/photos/1/edit路线.rbresources:galleriesdoresources:photosendresources:galleriesresources:photos照片Controller.rbdefnew@gallery=Gallery.find(params[:galle

  7. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  8. ruby - 没有类方法获取 Ruby 类名 - 2

    如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象

  9. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  10. ruby - 没有轨道的 ActiveRecord 时区 - 2

    我在非Rails项目中使用ActiveRecord。在Rails中,我可以这样做:config.time_zone='EasternTime(US&Canada)'config.active_record.default_timezone='EasternTime(US&Canada)'但如果我不使用rails,我该如何设置时区? 最佳答案 ActiveRecord::Base.default_timezone='EasternTime(US&Canada)' 关于ruby-没有轨道的A

随机推荐