2014-11-16 122 views
1

我在寫一個使用二維數組的程序。用戶選擇一行和一列;如果至少有一個元素直接與N S E或W匹配,則它變爲'。'。 我不斷收到段錯誤,因爲我經過各種測試和問題解決後相當確定,它會陷入如果top == bottom和bottom == top(或左和右)的循環中。由於我需要檢查所有四方,因此我需要對上方和下方進行檢查。 實施例:我被困在如果頂部==底部的循環,如果底部==頂部

0 - + + - 
1 + + - - 
2 - + - - 
3 + + + - 
4 - - + - 
    0 1 2 3 

如果用戶選擇(3,1)中的所有+的會改變爲'「。 我將不勝感激關於如何解決此問題的任何建議。下面是該功能的代碼。 謝謝!

extern int bb_pop(BBoardPtr b, int r, int c) { 
    char bal; 
    int curr, curc; 
    curr = r; 
    curc = c;   
    if(b->board[curr][curc] == b->board[curr-1][curc] && curr != 0 && b->board[curr-1][curc] != '.') { 
     curr--; 
     bb_pop(b, curr, curc); 
     b->board[curr][curc] = '.'; 
     count++; 
     curr = r; 
     curc = c; 
     } 
    if(b->board[curr][curc] == b->board[curr][curc-1] && curc !=0 && b->board[curr][curc] != '.') { 
     curc--; 
     bb_pop(b, curr, curc); 
     b->board[curr][curc] = '.'; 
     count++; 
     curr = r; 
     curc = c; 
     } 
    if(b->board[curr][curc] == b->board[curr+1][curc] && curr < rows-1 && b->board[curr+1][curc] != '.') { 
     curr++; 
     bb_pop(b, curr, curc); 
     b->board[curr][curc] = '.'; 
     count++; 
     curr = r; 
     curc = c; 
     } 
    if(b->board[curr][curc] == b->board[curr][curc+1] && curc<cols-1 && b->board[curr][curc] != '.') { 
     curc++; 
     bb_pop(b, curr, curc); 
     b->board[curr][curc] = '.'; 
     count++; 
     curr = r; 
     curc = c; 
     } 
    if(count > 0) { 
    b->board[r][c] = '.'; 
    } 

    printf("count %i\n", count); /////////////fix count 
    return count; 
} 

回答

1

在你的函數的頂部做到這一點:

charToFind = b->board[r][c]; 
b->board[r][c] = '.'; 
count = 1; 

然後用charToFind代替board[curr][curc],並刪除所有board[curr][curc]='.'因爲你的遞歸函數將這樣做。這應該是你的主體是這樣的:

if (r != 0 && b->board[r-1][c] == charToFind) 
    count += bb_pop(b, r-1, c); 
if (r < rows-1 && b->board[r+1][c] == charTofind) 
    count += bb_pop(b, r+1, c); 

// Do the same thing for the c-1 and c+1 cases. 

有一點需要注意的是,如果你的主板是大,你可能會改乘一個非常大的深度和溢出你的籌碼。

+0

然後它只改變每邊的單個元素。它沒有通過整個委員會檢查連接,匹配元素。 –

+0

curr和curc確定我正在檢查哪個字符 - 當前行當前列。所以如果用戶說3 1,它會開始檢查b-> board [3] [1]上的匹配。通過將其更改爲'。'馬上就不會再匹配'+'。我非常糟糕的遞歸,所以有可能是一種更好的方式,我在想什麼,我只是看不到它。 –

+0

我明白你的意思了。我不能在函數中添加任何新參數,但我會嘗試添加一個變量。 –