如何在列表中找到国家/地区的邻居?

时间:2015-07-11 14:01:00

标签: c++ algorithm list

我用c ++编写游戏风险编程。在该游戏中,您可以向您所在国家/地区的国家/地区宣战。

但我唯一可以想出来测试两个国家是否是邻居"如果测试是一个巨大的。

以下是清单的声明:

//Europe:
gebieden << CGebied("iceland","europe");
gebieden << CGebied("scandinavia","europe");
gebieden << CGebied("great-britain", "europe");
gebieden << CGebied("northern-europe","europe");
gebieden << CGebied("western-europe","europe");
gebieden << CGebied("southern-europe","europe");
gebieden << CGebied("ukraine", "europe");
//Asia
gebieden << CGebied("ural", "asia");
gebieden << CGebied("siberia", "asia");
gebieden << CGebied("yakutsk", "asia");
gebieden << CGebied("kamchatka", "asia");
gebieden << CGebied("irkutsk", "asia");
gebieden << CGebied("mongolia", "asia");
gebieden << CGebied("afghanistan", "asia");
gebieden << CGebied("china", "asia");
gebieden << CGebied("japan", "asia");
gebieden << CGebied("middle-east", "asia");
gebieden << CGebied("india", "asia");
gebieden << CGebied("siam", "asia");
//Australië
gebieden << CGebied("indonesia", "australia");
gebieden << CGebied("new-guinea", "australia");
gebieden << CGebied("western-australia", "australia");
gebieden << CGebied("eastern-australia", "australia");
//Africa
gebieden << CGebied("egypt", "africa");
gebieden << CGebied("north-africa", "africa");
gebieden << CGebied("east-africa", "africa");
gebieden << CGebied("congo", "africa");
gebieden << CGebied("south-africa", "africa");
gebieden << CGebied("madagascar", "africa");
//North-America
gebieden << CGebied("alaska","n-america");
gebieden << CGebied("northwest territory", "n-america");
gebieden << CGebied("alberta", "n-america");
gebieden << CGebied("ontario", "n-america");
gebieden << CGebied("quebec", "n-america");
gebieden << CGebied("greenland", "n-america");
gebieden << CGebied("western-us", "n-america");
gebieden << CGebied("eastern-us", "n-america");
gebieden << CGebied("central-america", "n-america");
//South-America
gebieden << CGebied("venezuela", "s-america");
gebieden << CGebied("brazil", "s-america");
gebieden << CGebied("peru", "s-america");
gebieden << CGebied("argentina", "s-america");

这是巨人如果测试的一部分:

if(QString::compare(naam1,"alaska",Qt::CaseInsensitive) || QString::compare(naam2,"alaska", Qt::CaseInsensitive))
{
    if(QString::compare(naam1,"kamchatka", Qt::CaseInsensitive) || QString::compare(naam2,"kamchatka", Qt::CaseInsensitive))
        return 1;
    if(QString::compare(naam1, "northwest territory", Qt::CaseInsensitive) || QString::compare(naam2, "northwest territory", Qt::CaseInsensitive))
        return 1;
    if(QString::compare(naam1, "alberta", Qt::CaseInsensitive) || QString::compare(naam2, "alberta", Qt::CaseInsensitive))
        return 1;
}

有更有效的方法吗? 谢谢!

3 个答案:

答案 0 :(得分:1)

您使用什么样的数据结构来存储您的诉讼?

我建议使用图表类型结构:对于每个国家/地区,您都会保留一个列表(std::set<Country*>)的邻居。通过这种方式,您可以轻松检查其他国家/地区是否在其邻居列表中。

另一种可能性是:

bool isNeighbour[COUNTRY_COUNT][COUNTRY_COUNT];

这比cc++。它假定您的县已编号,并且可以让您查找邻居,如

if(isNeighbour[countryAid][countryBid]){...

请记住,你必须两次填写每个关系才能使它们互相生效。

答案 1 :(得分:1)

我认为使用巨人&#39; if&#39;不是正确的方式。

我会尝试创建一个class Map,并且在该类的内部,我将使用每个国家的名称作为已经具有我需要的信息的函数,在这种情况下它是邻居。

这样做,每当我想要发现哪些国家/地区是邻居时,我只需要调用具有该国家/地区功能的class Map,例如country.Italy(neighbours)country.Italy(),其中country将是一个对象,意大利是Map类中函数的名称。

答案 2 :(得分:0)

您可以在每个国家/地区结构中使用指针向量来创建&#34;流程图&#34;比如说所有国家邻居的国家。

#include <iostream>
#include <vector>
#include <string>

using namespace std;

struct country{
    vector<country*> neighbours;
    //various other properties of the country.
    string name;
};

int main()
{
    country country1;
    country country2;
    country1.name = "The first country";
    country2.name = "The second country";
    //Make country1 and country 2 neighbours.
    country1.neighbours.push_back(&country2);
    country2.neighbours.push_back(&country1);

    cout<<country1.name<<" is a neighbour with "<<country1.neighbours[0]->name<<endl;

    return 0;
}