2014-02-20 52 views
-1

我知道這不是一個有趣的主題,但我只是練習一點C++。 我可以使用哪種方法來查找從某個點可以看到多少個對象。好了,所以這裏是一個前:找到看到的對象的方法

# # * # * 
# * # * # 
* # P * * 
# # # # # 
* # * # * 

左右,P是,你應該說你能有多少點看到,#是空的空間和*對象的點。我想我可以用一種利的算法,並在那裏是一個對象停止計數..

我做矩陣

f>>N>>M; 
for (i=1;i<=N;i++) 
{ 
    for (j=1;j<=M;j++) 
    { 
    f>>l; 
    switch (l) 
     { 
     case '#': { a[i][j]=0; break;} 
     case '*': { a[i][j]=-2; break;} 
     case 'P': { a[i][j]=-1; break;} 
     } 
    } 
} 

而現在,當計數器達到-2停止..請幫助我:O3

+1

我不明白。你能解釋一下問題的具體情況:你期望看到什麼,看到了什麼,取而代之的是什麼樣的錯誤等等。你使用調試器嗎? – Drop

+0

你可以看看其他物體嗎?你可以看到哪些方向(只有水平,垂直,對角線,任意)? –

+0

不,這是關鍵,你不能看透物體,你可以看任何方向 – Bogdan

回答

0

我可以從你展示什麼是告訴如下:

我做矩陣

認爲你指的是具有類似

f>>N>>M; 

int a[N][M]; // Note this is non standard! 

您的for循環的初始化是錯誤的:

for (i=1 /* <---- */ ;i<=N;i++) 

C中的數組索引++在0開始,你的循環初始化應該是這樣的:

for (i=0 /* Note the 0 */ ;i<=N;i++) 
1

這裏的基本點是能見度檢查。如果行(px, py) - (x, y)上沒有對象,則某個點(x, y)(px, py)可見。對象只能位於整數位置。所以我們必須檢查這條線上的每一點。

.................. 
.    o 
.    x 
.   x 
.  x  
. x 
. p 

假設我們想從p檢查o知名度。起初我們應該計算差異。在這種情況下,odx=15單位右側和dy=5單位以上p。對象只能在某些位置。可能的位置以等距分佈在線上。點的數量由dxdy的最大公約數定義(因爲dxdy都需要是整數)。 5和15的gcd是5.所以我們必須檢查5個可能的位置(標記爲x)。 stepX = dx/gcd = 15/5 = 3stepY = dy/gcd = 5/5 = 1。最後一點是o,所以我們不需要檢查這一點。

我們可以定義清晰視野檢查,做類似如下(假設有一個gcd功能)功能:

bool isVisible(int** matrix /*or any other appropriate declaration */, int px, int py, int ox, int oy) 
{ 
    int dx = ox - px; 
    int dy = oy - py; 
    int div = gcd(abs(dx), abs(dy)); 
    int stepX = dx/div; 
    int stepY = dy/div; 
    for(int i = 1; i < div; ++i) 
    { 
     int checkX = px + i * stepX; //these could be computed incrementally 
     int checkY = py + i * stepY; 
     if (matrix[checkX][checkY] == 2) //blocked 
      return false; 
    } 
    return true; 
} 

注意,此功能的說明,可能無法發揮作用。

如果你已經建立了矩陣並且你知道p的座標,那麼你所要做的就是迭代每個位置。調用帶有位置的上述函數來檢查它是否可見,如果是這種情況,則增加計數器。在此過程中跳過p

下面是另一個更明顯需要gcd的例子。 dx = 16dy = 12

.................. 
.    o 
.     
. 
.   x 
. 
. 
.  x 
. 
. 
. x 
. 
. 
.p 
+0

**呵呵!! **你是否是順帶進行OP測試的作者? –

+0

@πάνταῥεῖ不;;) –

相關問題