2011-04-23 6 views
0

그래, 정말 생각해 본 것 같아.하지만 48 시간 동안 똑바로 프로그래밍하고 내 마음이 없어 졌어. 배경 정보 : Visual Studio 2010을 사용하여 C++을 사용하여 콘솔 응용 프로그램 만들기 나는 약간의 논리에 문제가 있었고 다음에 붙어 있었다 :3 개의 값을 포함하는 2D 배열을 실행하고 값을 확인하려면 어떻게해야합니까?

나는 2 차원 8 x 8 배열, 행렬 [8] [8]을 가지고있다. 이 배열에는 0, 1 및 2가 포함됩니다. 이제 프로그램이 실행될 때 배열은 1 또는 2를 0으로 대체합니다. 그래서 그것이 실행 중일 때 배열에 1 또는 2가 모두 제거되었는지 확인해야합니다. 따라서 0과 1 만있는 경우 "0"과 "2"만 있으면 "your array has 2 's"와 같은 메시지를 말하고 그 반대도 마찬가지입니다.

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의 * 행]에 대한 반복자를 사용하는 클래스에 매트릭스 랩이 더 효율적입니다 . 만약 당신이이 문제를 해결했다면 C++ 용어로 단순한'fold '또는'accumulate'가 될 것입니다. 이렇게하면 "사라지다"는 생각을하지 않게됩니다. – pmr

+0

조언을 주셔서 감사합니다 – tehman

답변

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

이것은 정확히 내가 필요한 것입니다. 모두에게 감사 드리며, 빠른 반응은 완벽했습니다. 스택 오버플로에서 위대한 커뮤니티. – tehman

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]]++; 
    } 
} 

이이 있으면, 당신은 단순히 수를 당신은 전체 매트릭스를 거쳐 그 결과를 알고 매트릭스에서 1의 수를 보려면 counts[1]을 확인하십시오. 또한 반복적으로 값을 바꾸는 경우 각 반복 후에 전체 행렬을 다시 검사하지 않아도됩니다. 행렬을 변경할 때 개수를 변경할 수 있습니다.

0

만 각 배열 요소에 0-2이 당신에게 것입니다 가정 : INT 발스 = 0; 위한 (INT 행 = 0; 행 < 8; 행 ++) 대 (INT의 COL = 0; < 내지 컬럼 8, COL ++) { 발스 | = 행렬의 행 [COL]; if (vals == 3) 휴식; } if (vals & 1) cout < < "매트릭스에 1이 포함되어 있음"< < endl; if (vals & 2) cout < < "매트릭스에 2가 들어 있음"< < 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

+0

@tehman count 변수가 있으면 행렬을 업데이트하는 코드에이 루프를 쉽게 래핑 할 수 있습니다. 당신은 count [old_value [-; count [new_value] ++; 행렬을 업데이트하고 하단의 if 조건을 사용할 때. 루프의 오버 헤드를 줄입니다. –

관련 문제