2012-10-09 83 views
1

嗨我想用C++製作一個座標系。我會從用戶那裏得到幾個(x,y)座標,並且使用它我需要創建一個座標系(更多地圖)樣式。我怎樣才能做到這一點?它需要如下圖所示。我應該使用二維數組還是矢量,以及如何讓循環執行不同的標記?C++中的座標系

(2,0),(4,3),(7,8) 需要看起來像

**1************ 
*************** 
*************** 
*************** 
***1*********** 
*************** 
*************** 
********1****** 

這是我到目前爲止的代碼,但問題是我不能標記更多而不是其中的一個座標。我只用了2個循環來做到這一點

for(int i = -6; i < 7; i++) 
    if (i < 0) 
     cout<<" "<<i; 
    else 
     cout<<" "<<i; 
cout<<endl; 

for(int i = 0; i < 15; i++) 
    { 
     cout<<(char)(i + 49); 
     for(int j = -6; j < 7; j++) 
     if(i == y - 1 && j == x) 
      cout<<" x "; 
     else 
      cout<<" . "; 

     cout<<(char)(i + 49)<<endl; 
    } 

請指教。謝謝 !!

回答

5

我建議您使用vector<string>vector<vector<char> >或甚至vector<vector<string> >,具體取決於您打算存儲在單元中的內容。如果一個單元格是單個字符,那麼可能第一個選項是最好的。 而在這之後創建的地圖是很容易的:

int n,m; 
cin >> n >> m; 
vector<string> a(n, string(m, '*'); 

我不知道什麼是「」和'x',但是我將所有剩下的東西成像爲輸入幾對座標,並用'1'代替vector<string>中的相應元素。

希望這會有所幫助。

+1

矢量> FTW。使標記元素直觀imho。 +1,順便說一句。但你的權利,傾銷到控制檯很難打敗一大堆字符串= P – WhozCraig

+1

加速C + +(Koenig&Moo)在這裏也使用向量字符串方法。它允許使用'a [y] [x]'語法。這可能是違反直覺的。 – MSalters

+0

+1,這可能是op的阻力最小的路徑。但值得注意的是,取決於'興趣點'與地圖大小的相對稀疏程度,以及*如果地圖需要動態增長或不*,定義一個包裹std :: pair的CoordType和適當的比較運算符,並將它用作地圖/集合中的關鍵(類似於Pawel的答案)可能是更自然的實現。國際海事組織(IMO),網格圖的維度是否在其整個生命週期內保持不變是決定哪一種方法更好的關鍵因素。 – WeirdlyCheezy

0

要回答您的其他問題,您可以使用循環進行更改,並使用循環顯示結果。 使用izomorphius的建議,它應該是這樣的,如果你用一個列表來存儲對座標:

vector<string> matrix ; 
list<pair> PairList ; 

for (list<pair>::const_iterator it = PairList.beguin(); i < PairList.end(); it++) { 
    matrix[ (*it).second ][ (*it).first ] = "." ; 
} 

並顯示結果:

for (int i = 0; i < matrix.size; i++) { 
    cout << matrix[i] << endl ; 
} 
1

我會建議使用std::pairstd::set代替std::vector - 沒有必要保持整個網格的記憶,我們只需要點。

http://liveworkspace.org/code/f434521b804485f16786556762780448

+0

Whaaaat?哦,你的意思是一個容納魔術點而不是整個網格的容器。我知道了 –

+0

map的'map'是一個可怕的想法,因爲這隻會比矢量大得多,速度慢。絕不是更好。特殊點的「集合」是一個好主意。 –

+0

更慢 - 是的,更大 - 也許,但我懷疑它。只有當魔法點的數量很大時(例如網格上的全部點的10%-20%),纔有可能。使用'vector'來保存整個網格大概不超過225B--我認爲15分的「地圖」仍然會比這個小。 –