2009-11-05 114 views
2

我很無聊,所以我創建了一個小型控制檯掃雷遊戲,並且在寫它的同時,我不得不在元素的大小*尺寸矩陣中找到元素的鄰居位置,一個保存大小值的變量。我不想返回鄰居元素的實際值,但他們的位置,以便我可以使用它作爲一個公共職能(否則客戶端可以看到地雷在哪裏:P)。查找矩陣中的鄰居位置

例如用於現場當量0和大小當量3函數應該返回{1,3,4}:

1 0 0 0 1 0 
0 0 0 => 1 1 0 
0 0 0 0 0 0 

那麼,basicaly它看起來像這樣:

vector<int> adjecantPositions(int field, int size) 
{ 
    int row = field/size; 
    int col = field % size; 
    vector<int> result; 

    /* 
     1 0 0 
     1 0 0 
     1 0 0 
    */  
    if (col > 0) 
    { 
     result.push_back(calcField(row, col-1, size)); 

     if (row > 0)  
      result.push_back(calcField(row-1, col-1, size)); 
     if (row < size - 1) 
      result.push_back(calcField(row+1, col-1, size)); 
    } 

    /* 
     0 0 1 
     0 0 1 
     0 0 1 
    */ 
    if (col < size - 1) 
    { 
     result.push_back(calcField(row, col+1, size)); 

     if (row > 0)  
      result.push_back(calcField(row-1, col+1, size)); 
     if (row < size - 1) 
      result.push_back(calcField(row+1, col+1, size)); 

    } 

    /* 
     0 1 0 
     0 0 0 
     0 1 0 
    */ 
    if (row > 0) 
     result.push_back(calcField(row-1, col, size)); 
    if (row < size - 1) 
     result.push_back(calcField(row+1, col, size)); 

    return result; 
} 

calcField( int,int,int)只是將座標轉換爲字段編號(row * size + col)。

這是一個快速的解決方案,但它不是優雅的,我敢打賭,有一些更好的方法來做到這一點。有任何想法嗎?

回答

1

是的,你的代碼很糟糕。這裏有一個更好的嘗試(固定,不好意思):

for (int dx=-1; dx<=1; dx++) 
    for (int dy=-1; dy<=1; dy++) 
    if (dx || dy){ 
     int x = row+dx, y=col+dy; 
     if (x >= 0 && x < size && y >= 0 && y < size) 
     result.push_back(calcField(x, y, size)); 
    } 
+0

此代碼返回不正確的結果,但我看到你穿越前後場形成3x3矩陣......我不明白,我沒有想到這一點。 – schmrz 2009-11-05 11:56:25

0

這裏的固定代碼帕維爾的解決方案:

for (int drow = -1; drow <= 1; drow++) 
{ 
    int rrow = row + drow; 

    for (int dcol = -1; dcol <= 1; dcol++) 
    { 
     int rcol = col + dcol; 

     if (rrow >= 0 && rrow < size && rcol >= 0 && rcol < size 
      && !(rrow == row && rcol == col)) 
      result.push_back(calcField(rrow, rcol, size)); 
    } 
} 
1

爲什麼不使用你的座標的對象?我認爲這將是更具可讀性:

struct Coords 
{ 
    int row; 
    int col; 

    Case(row, col) : row(row), col(col) {} 
    bool isValid(int size) 
    { 
    return row >= 0 && col >= 0 && row < size && col < size; 
    } 
} 

vector<Coords> adjecantPositions(const Coords & field, int size) 
{ 
    vector<Coords> result; 
    for(int drow = -1; drow <= 1; ++drow) 
    { 
    for(int dcol = -1; dcol <= 1; ++dcol) 
    { 
     Coords current(field.row + drow, field.col + dcol); 
     if(current.isValid(size)) 
     { 
     result.push_back(current); 
     } 
    } 
    } 
    return result; 
}