2015-07-11 57 views
-2

我正在用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; 
} 

有沒有更有效的方法? 謝謝!

+0

創建一個「鄰居地圖」。 –

+3

你的問題是:「嗨,我有一個我正在存儲的國家列表,據推測在一些我不會解釋的結構中,我現有的邊界國家測試效率非常低,在某些方面我也不會解釋,但我希望有人告訴我如何讓它更有效率,沒有我展示實際低效的代碼,只是模糊地將其描述爲「巨人如果測試」;所以每個人都必須使用他們神奇的頭腦射線束機爲了看看我腦海中的代碼,並告訴我如何讓它變得更好「。這是對你的問題的準確描述嗎? –

+0

是的,這是相當準確的,我會上傳我的代碼:) – BramKel

回答

1

你用什麼樣的數據結構來存儲你的求婚信息?

我會建議一個圖形類型結構:爲每個國家你保留一個列表(std::set<Country*>)的鄰居。通過這種方式,您可以輕鬆地檢查是否有其他國家在其鄰居列表中。

另一種可能性是:

bool isNeighbour[COUNTRY_COUNT][COUNTRY_COUNT]; 

這比c++c。它假定您的縣進行編號,使您查找neighbourness

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

但請記住,你必須在每個關係,以填補兩次,使它們相互的。

+0

這確實是一種方式,但它幾乎與if測試一樣高效...... – BramKel

+0

那麼,字符串比較是相當多的工作。你可以嘗試按ID查找你的國家。如果你將它們存儲在'QSet '中,查找一個國家將只需要'O(log(n))'時間。 (我不知道'gebieden'​​的類型,但是如果你實現了'CGebied :: isNeighbour'',那麼你可以做'gebieden [「alaska」]。isNeighbour(gebieden [「birma」])''。 –

0

您可以在每個國家/地區結構中使用一個指針向量來創建一個「流程圖」,類似於指向所在國家/地區鄰國的所有國家/地區的引用。

#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; 
} 
1

我覺得用「如果」巨人不會按照正確的方式。

我會嘗試創建一個class Map,而在該類的內部,我將使用每個國家的名稱作爲已經有我需要的信息的函數,在這種情況下,它是鄰居。

這樣,每當我要發現哪些國家我只需要調用class Map與該國的功能,如country.Italy(neighbours)或只是country.Italy(),其中國家將是一個對象和意大利的函數名鄰居在Map類裏面。