2011-04-23 49 views
0

好吧,我真的認爲我在想這個,但是我已經編程了48個小時,我的腦海消失了。背景信息:使用Visual Studio 2010,使用C++創建控制檯應用程序。我遇到了一些邏輯問題,並陷入以下內容:如何通過包含3個值的2D數組運行並檢查值?

我有一個2維8 x 8陣列,矩陣[8] [8]。該數組包含0,1和2。現在隨着程序執行,數組用1代替1或2。所以當它運行時,我想要檢查一下數組是否已經刪除了全部1或2。因此,如果只有0和1,我想表達一個類似「你的數組不再包含2」的消息,反之亦然,如果只有0和2的話。

下面是一些代碼我在想使用的:

for(row = 0; row < 8; row++) 
{ 
    for (col = 0; col < 8; col++) 
    { 
     if(matrix[row][col] != 1){ 
      cout<<"message"<<endl; } 

     else if(matrix[row][col] != 2){ 
      cout<<"message"<<endl; } 
    } 
} 

現在我的這個問題是,如果該數組包含[0,1,2,0],將運行通過,並檢查所述第一元件,它不會包含1或2個。關於我能做些什麼的一些想法?

+0

提示一束:總結你的矩陣中的一類,使用迭代這個類,矩陣[COL *行]更有效。如果你這樣做解決你的問題是一個簡單的'fold'或'accumulate'(用C++術語)。 這也讓你的思想免於「消失」。 – pmr 2011-04-23 22:15:18

+0

感謝您的意見 – tehman 2011-04-23 22:34:56

回答

1

你不能決定在循環內。你只知道在整個矩陣會後的結果:

bool hasOnes = false; 
bool hasTwos = false; 
for(row = 0; row < 8; row++) 
{ 
    for (col = 0; col < 8; col++) 
    { 
     if(matrix[row][col] == 1) { 
      hasOnes = true; 
     } else if(matrix[row][col] == 2){ 
      hasTwos = true; 
     } 
} 

if (hasOnes && !hasTwos) 
    cout << "You have removed twos" << endl; 
if (hasTwos && !hasOnes) 
    cout << "You have removed ones" << endl; 
+0

這正是我所需要的。謝謝大家,快速回復是完美的。 Stack溢出的大社區。 – tehman 2011-04-23 22:23:39

0

我建議你遍歷矩陣和計數像這樣的所有元素:

int counts[3]; 
for(i = 0; i < 3; i++) 
{ 
    counts[i] = 0; 
} 
for(row = 0; row < 8; row++) 
{ 
    for (col = 0; col < 8; col++) 
    { 
     counts[matrix[row][col]]++; 
    } 
} 

一旦你有了這個,你可以簡單地檢查counts[1]以查看矩陣中的個數。而且,如果迭代替換值,則可以避免在每次迭代後重新檢查整個矩陣。您可以在更改矩陣時更改計數。

0

假設你只會只有在每個數組元素中有0-2: int vals = 0;對於(int row = 0; row < 8; row ++) for(int col = 0; col < 8; col ++) { vals | = matrix [row] [col]; if(vals == 3) break; } if(vals & 1)cout < <「Matrix contains 1's」< < endl; if(vals & 2)cout < <「Matrix contains 2's」< < endl;

0
int count[3] = {0,0,0}; 
for (int i = 0; i < 64; i++) count[*(matrix + i)]++; 

if (count[0] + count[1] == 64) cout<<"No 2s exist"<<endl; 
if (count[0] + count[2] == 64) cout<<"No 1s exist"<<endl; 

編輯
這可能是稍快

int count[3] = {0,0,0}; 
for (int i = 0; i < 64; i++) 
    if (!count[1] && !count[2]) count[*(matrix + i)]++; 
    else break; 

if (count[0] + count[1] == 64) cout<<"No 2s exist"<<endl; 
if (count[0] + count[2] == 64) cout<<"No 1s exist"<<endl; 
+0

這也適用,但布爾語句似乎對我更容易。謝謝! – tehman 2011-04-23 22:35:52

+0

@tehman如果你有count變量,將這個循環包裝到更新矩陣的代碼中會更容易。你可以做一些像count [old_value [ - ;算[NEW_VALUE] ++;當你更新矩陣時,只需在底部使用if條件。減少循環的開銷。 – 2011-04-24 02:53:00

相關問題