N×Nの正方行列を斜め方向に昇順で並び替えるプログラムを作成したいです。
例えば
1 3 5
4 6 1
5 7 4
という正方行列があった時
1 1 5
4 4 3
5 7 6
というように右下がり対角線方向に向かって昇順に並び替えるプログラムを作成したいです
発生している問題・エラーメッセージ
実行結果 -------------------------------------- ./a.out 正方行列の列の数を入力してください。 3 3×3行列A(i,j)の要素を入力してください。 A( 1, 1) = 1 A( 1, 2) = 5 A( 1, 3) = 3 A( 2, 1) = 4 A( 2, 2) = 6 A( 2, 3) = 2 A( 3, 1) = 4 A( 3, 2) = 8 A( 3, 3) = 2 before sort: 1 5 3 4 6 2 4 8 2 ans 0 0 3 5 6 2 6 4 2 ----------------------------- このようにソート前の配列を出力するところまではうまくいってるのですがそのあとの並び替えた後の配列を出力するときに よくわからない値が出てきてしまいます。おそらく斜め方向にソートする部分が間違っていると思いますが自分では解決できませんでした。
該当のソースコード
C
1#include <stdio.h> 2 3#define min 0 4#define max 100 5void Bsort(int data[], int size){//バブルソート 6 int i, j,tmp; 7 for(i=0;i<size;i++){ 8 for(j=i+1;j<size;j++){ 9 if(data[i]<data[j]){ 10 tmp=data[i]; 11 data[i]=data[j]; 12 data[j]=tmp; 13 } 14 } 15 } 16} 17void printArray(int n,int a[n][n]){//配列を出力する関数 18 int i,j; 19 for(i=0;i<n;i++){ 20 for(j=0;j<n;j++)printf("%4d",a[i][j]); 21 printf("\n"); 22 } 23} 24 25int input(int mi, int ma){//値をインプットする関数 26 int result; 27 while(1){ 28 scanf("%d",&result); 29 if(mi<=result&&result<=ma) break; 30 printf("入力された値は無効です\n"); 31 } 32 return result; 33} 34 35int main (void){ 36 int i,j,n,m; 37 printf("正方行列の列の数を入力してください。\n"); 38 n=input(min,max); 39 int before[n][n],ans[n][n]; 40 41 printf("%d×%d行列A(i,j)の要素を入力してください。\n",n,n); 42 for(int i=0; i<n; i++){ 43 for(int j=0; j<n; j++){ 44 printf("A(%2d, %2d) = ",i+1,j+1); 45 scanf("%d",&before[i][j]); 46 } 47 } 48 printf("before sort:\n");//ソート前の行列を出力 49 printArray(n,before); 50 51 for(i=1;i<=n;i++){//斜め方向に並び替え 52 int temper[i];//要素を一時的に格納する配列 53 for(j=0;j<i;j++){ 54 temper[j]=before[n-i+j][j]; 55 } 56 Bsort(temper,i);//行列の要素をソート 57 for(int k=0;k<i;k++){ 58 ans[i-k+1][k]=temper[k];//斜め方向に格納 59 } 60 } 61 for(i=1;i<=n;i++){ 62 int temper2[i]; 63 for(j=0;j<i;j++){ 64 temper2[j]=before[j][n-i+j]; 65 } 66 Bsort(temper2,i); 67 for(int k=0;k<i;k++){ 68 ans[k][i-k+1]=temper2[k]; 69 } 70 } 71 printf("ans\n"); 72 printArray(n,ans);//ソート後の行列を出力 73 return 0; 74}
試したこと
斜めソートについて具体例を考えforループの中身をよく見なおしたり、何回も実行してどのような処理がされているのか考えました。
しかしどこで間違えているのかわかりませんでした。
どなたかご教授いただければ助かります。よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Visual sutdio code
Ubunts 20.0.4.LTS
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。