2011-04-23 47 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

相关问题