0

私は数時間前に質問をしましたが、その質問で尋ねていたことを終えた後、何をしなければならなかったかについて混乱しています. 人々が私にくれたすべての解決策は問題ありませんでしたが、質問を本来あるべきように書いていなかったため、私が本当に探していたものには役に立ちませんでした。値の重要な位置を保存する必要がありましたが、問題を解決するために他の質問で保存する必要はありませんでした。だからここに適切なものがあります。

(すべては上記の例で説明されており、理解するのは簡単です) 私は 8x8 行列を持っており、必要な行を選択した後、その 3 つの最小要素を取得し、この 3 つのうちの 1 つをランダムに選択したいと考えています。次に、この数値を含む行と列を削除します。問題は、これらの 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);

これが私がやりたいことです。初期行列が (常に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,

アルゴリズムは、その行の 3 つの最小要素を選択する必要があります。

0, 1, 1

そして、この3つからランダムに1つを選びます。たとえば、最初の「1」を選択すると...

0, **1**, 1

... アルゴリズムはその行の 3 番目の列に移動し (これが「1」の位置だったため)、行と列を削除する必要があるため、出力マトリックスは次のようになり、元のマトリックスよりも 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,
    };

ラインに到着する方法しか知りませんが、問題のポインターがたくさんあり、Cにあまり詳しくないため、3つの最小値を処理するのに問題があります。
よろしくお願いします

4

3 に答える 3

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
*/
于 2013-05-14T09:16:17.347 に答える
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;
}
于 2013-05-21T07:43:21.983 に答える