2013-05-13 2 views
0

몇 시간 전에 a question을 만들었지 만, 그 질문에 대한 질문을 마치면 끝내야 할 일을 혼란스럽게합니다. 사람들이 저에게 준 모든 해결책은 괜찮 았지만 내가 정말로 찾고 있었던 것에 대해서는 쓸모가 없었습니다. 그렇기 때문에 나는 질문을 썼습니다. 저는 중요한 가치를 지닌 위치를 구해야했습니다. 문제를 해결하기 위해 다른 질문에 구원받을 필요는 없었습니다. 여기에 적절한 것이 있습니다.값을 찾은 후 행렬의 행과 열을 제거합니다. (C)

(위의 예제로 모든 것이 설명됩니다. 이해하기 쉽습니다) 저는 8x8 매트릭스를 가졌으며, 원하는 행을 선택한 후에 3 가지 최소 요소를 얻고 싶습니다. 무작위로. 그런 다음이 번호가 포함 된 행과 열을 제거하십시오. 것은 그 세 가지 요소를 처리하고 열/행을 제거하는 방법을 알지 못한다는 것입니다. 나는 다음 요소 인 최소 요소를 얻는 방법을 알고있다.

int pieza[ROWS][COLS] = { 
0, 2, 2, 5, 3, 2, 1, 1, 
0, 4, 5, 2, 4, 3, 0, 0, 
0, 4, 2, 2, 1, 2, 3, 2, 
0, 3, 1, 5, 1, 2, 3, 4, 
2, 5, 6, 5, 3, 1, 2, 7, 
8, 2, 0, 0, 0, 2, 1, 1, 
1, 2, 2, 1, 1, 6, 3, 4, 
0, 1, 3, 2, 0, 0, 0, 0, 
}; 

int myrow = 3; // the row I want to analyze 
int index; 
int min=0; 

for (index=0;index<8;index++) { 
    printf("%d", piezas[myrow][index]); 
    if(piezas[myrow][index]<min) 
     min=piezas[myrow][index]; 
    printf("\t\t"); 
} 
printf("min: %d", min); 

이것은 내가하고 싶은 것입니다. 초기 행렬 (A nxn 매트릭스 항상있는) 인 경우 :

{ 
0, 2, 2, 5, 3, 2, 1, 1, 
0, 4, 5, 2, 4, 3, 0, 0, 
0, 4, 2, 2, 1, 2, 3, 2, 
0, 3, 1, 5, 1, 2, 3, 4, 
2, 5, 6, 5, 3, 1, 2, 7, 
8, 2, 0, 0, 0, 2, 1, 1, 
1, 2, 2, 1, 1, 6, 3, 4, 
0, 1, 3, 2, 0, 0, 0, 0, 
}; 

은 내가 행 번호 3를 선택

0, 3, 1, 5, 1, 2, 3, 4, 

알고리즘은 해당 행의 세 가지 최소 요소를 선택해야합니다.

0, 1, 1 

그리고 이들 중 하나를 임의로 선택하십시오. 예를 들어, 첫 번째 '하나'...

0, **1**, 1 

이 ... 알고리즘이 그 라인은 13 번째 열로 이동합니다 선택한 경우 (즉이었다 위치했다 becaue을하는 '1') 및

{ 
    0, 2, 5, 3, 2, 1, 1, 
    0, 4, 2, 4, 3, 0, 0, 
    0, 4, 2, 1, 2, 3, 2, 
    2, 5, 5, 3, 1, 2, 7, 
    8, 2, 0, 0, 2, 1, 1, 
    1, 2, 1, 1, 6, 3, 4, 
    0, 1, 2, 0, 0, 0, 0, 
    }; 

난 단지 라인에 도착하는 방법을 알고 : (당신이 행과 열을 제거한 beucase) 원래 매트릭스보다 적은, 하나 개의 차원을 행과 열을 제거하므로 다음과 같이 출력 행렬이 될 것입니다 ,하지만 난 문제가 포인터의 톤을 가지고 있고 C로 많이 아니에요 때문에 3 최소를 처리하는 데 문제가있어.
미리 감사드립니다

+0

귀하의 최종 매트릭스 (원하는 출력)하지 않습니다 이해가된다면'[8] [8]'로 선언 된 행렬을 가질 수없고 단지 7x7 행렬에 대한 이니셜 라이저 만 제공하면됩니다. 7 개 요소 뒤에 줄 바꿈을한다는 사실은 C 컴파일러에 아무런 의미가 없다는 것을 의미하기 때문에, 여러분이 요구하는 것이기 때문에 8x8 행렬을 줄 것입니다. – unwind

+0

내 잘못입니다. 'nxn' 매트릭스를 주면 출력 매트릭스는'n-1 x n-1' 매트릭스가되어야합니다. 1 차원 적은. 게시물이 지금 편집됩니다. –

답변

1

열 개수로 정렬되는 예제. 이하

#include <stdio.h> 
#include <stdlib.h> 

typedef struct pair { 
    int value, column; 
} Pair; 

int cmp(const void *a, const void *b){ 
    Pair *pa = (Pair *)a; 
    Pair *pb = (Pair *)b; 
    return pa->value - pb->value; 
} 

int main(void){ 
    int data[8] = {0, 3, 1, 5, 1, 2, 3, 4}; 
    Pair data_pair[8]; 
    int i; 
    for(i=0;i<8;++i){ 
     data_pair[i].value = data[i]; 
     data_pair[i].column = i; 
    } 
    qsort(data_pair, 8, sizeof(Pair), cmp); 
    for(i=0;i<3;++i) 
     printf("value = %d, column = %d\n", data_pair[i].value, data_pair[i].column); 
    return 0; 
} 
/* result 
value = 0, column = 0 
value = 1, column = 2 
value = 1, column = 4 
*/ 
+0

정말 감사합니다. –

+0

당신을 진심으로 환영합니다. – BLUEPIXY

1
#include <stdio.h> 
#include <string.h> 

#define SIZE 8 

void delrow(int a[SIZE][SIZE], int row){ 
    if(row < SIZE - 1) 
     memmove(&a[row], &a[row+1], (SIZE*SIZE - SIZE*(row+1))*sizeof(int)); 
}; 
void delcol(int a[SIZE][SIZE], int col){ 
    int r; 
    if(col < SIZE - 1){ 
     for(r=0;r<SIZE;++r){ 
      memmove(&a[r][col], &a[r][col+1], (SIZE - (col+1))*sizeof(int)); 
     } 
    } 
} 

int main(void){ 
    int piezas[8][8] = { 
     0, 2, 2, 5, 3, 2, 1, 1, 
     0, 4, 5, 2, 4, 3, 0, 0, 
     0, 4, 2, 2, 1, 2, 3, 2, 
     0, 3, 1, 5, 1, 2, 3, 4, 
     2, 5, 6, 5, 3, 1, 2, 7, 
     8, 2, 0, 0, 0, 2, 1, 1, 
     1, 2, 2, 1, 1, 6, 3, 4, 
     0, 1, 3, 2, 0, 0, 0, 0, 
    }; 
    //test 
    int row = 8, col = 8; 
    int r,c; 
    delrow(piezas, 3); 
    row -= 1; 
    for(r=0;r<row;++r){ 
     for(c=0;c<col;++c) 
      printf("%2d", piezas[r][c]); 
     printf("\n"); 
    } 
    printf("\n"); 
    delcol(piezas, 1); 
    col -= 1; 
    for(r=0;r<row;++r){ 
     for(c=0;c<col;++c) 
      printf("%2d", piezas[r][c]); 
     printf("\n"); 
    } 
    return 0; 
} 
/* result 
0 2 2 5 3 2 1 1 
0 4 5 2 4 3 0 0 
0 4 2 2 1 2 3 2 
2 5 6 5 3 1 2 7 
8 2 0 0 0 2 1 1 
1 2 2 1 1 6 3 4 
0 1 3 2 0 0 0 0 

0 2 5 3 2 1 1 
0 5 2 4 3 0 0 
0 2 2 1 2 3 2 
2 6 5 3 1 2 7 
8 0 0 0 2 1 1 
1 2 1 1 6 3 4 
0 3 2 0 0 0 0 
*/ 
+0

해답을 주셔서 감사합니다.하지만 행과 열만 제거합니다. 문제는 행과 열을 제거하기 위해 도착하기 전에 게시물에서 읽을 수있는 값을 찾는 데 문제가 있습니다. –

+0

@Borja 데이터가 변경된 것 같지만 프로그램에 문제가없는 것으로 생각합니다. 귀하의 예제는 두 번째 colomn을 제거합니다. – BLUEPIXY

+0

그냥'nxn' 형식으로 행렬을 넣었습니다. 입력 행렬에는 7 개의 행이 있고 출력 행렬에는 7 개의 행이 있으며 출력 행렬에는 행과 같이 행이 하나 더 적어야합니다. 두 행을 모두 제거해야하고 행만 제거해야하기 때문입니다. 게시물의 예를 확인하십시오. 미리 감사드립니다. –

0

는 행과 열을 제거하기 전에 선택된 행에서 제 - 네 요구 n 번째 가장 작은 소자를 얻을 수 추출물이다.

  1. 복사 행
  2. 정렬 복사 열 (정렬 너무 동안 색인을 저장)
  3. 정렬 된 인덱스
  4. 0 회 또는 1 또는 제 n 분 정렬 된 인덱스 색인을 선택 소트 순서 값의 위치를 ​​나타내는 .

------------ 매우 초안 코드 ---- 시도 최적화 -------

#include <stdio.h> 
#include<memory.h> 

void sortIndex(int *array, int *arrayIdx) 
{ 
int i=0,j=0; 
int temp=0; 

int tempArr[4]; 

memcpy(tempArr, array, 4*sizeof(int)); 
for(i=0;i<4;i++) 
{ 
    printf("%d ",tempArr[i]); 
} 
printf("\n"); 

    for(i=0;i<4;i++) 
    { 
    for(j=i+1;j<4;j++) 
    { 
     if(tempArr[i]>tempArr[j]) 
     { 
     temp = arrayIdx[i]; 
     arrayIdx[i]=arrayIdx[j]; 
     arrayIdx[j]=temp; 

     temp = tempArr[i]; 
     tempArr[i]=tempArr[j]; 
     tempArr[j]=temp; 
     } 
    } 
    } 
printf("Sorted array Index\n"); 
for(i=0;i<4;i++) 
{ 
    printf("%d ",arrayIdx[i]); 
} 
printf("\n"); 
printf("Sorted array Value\n"); 
for(i=0;i<4;i++) 
{ 
    printf("%d ",array[arrayIdx[i]]); 
} 
printf("\n"); 
} 


int main() 
{ 
int array[4][4] = {{4,3,2,1},{7,5,4,3},{6,5,4,4},{5,5,2,1}}; 
int sortedIdx[4] = {0,1,2,3}; 
int i,ii; 

for(i=0;i<4;i++) 
{ 
    for(ii=0;ii<4;ii++) 
     printf("%d ",array[i][ii]); 
    printf("\n"); 
} 

printf("(Note:Count from 0). Which Row : "); 
scanf("%d",&i); 
sortIndex(array[i],sortedIdx); 

printf("\n"); 

printf("(Nth smallest value)Give a N value (0 to 3): "); 
scanf("%d",&ii); 
printf(" (%d) smallest value in row (%d) is (%d)\n",ii,i,array[i][sortedIdx[ii]]); 

printf("Now call function to remove Row (%d) and column (%d)\n",i,sortedIdx[ii]); 

return 0; 
} 
관련 문제