c·c++/c 프로그래밍

2차원 shuffle

바로이순간 2014. 2. 18. 20:56

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

void small(int n, int a[][20]) {

    int base[20];

    int i, j, k, t, x, z=0;


    for(i=0;i<n;i+=1) {

        base[i]=i+1;

    }

    for(i=0;i<n;i+=1) {

        while(1) {

            for(j=0;j<n;j+=1) {

                x=rand()%n;

                t=base[j];

                base[j]=base[x];

                base[x]=t;

            }

            for(j=0;j<n;j+=1) {

                for(k=0;k<i;k+=1) {

                    if(a[k][j]==base[j]) { break; }

                }

                if(k<i) { break; }

            }

            if(j<n) { continue; }

            for(j=0;j<n;j+=1) {

                a[i][j]=base[j];

            }

            break;

        }

    }

}

void printArr(int n, int a[][20]) {

    int i, j;

    for(i=0;i<n;i+=1) {

        for(j=0;j<n;j+=1) {

            printf("%3d", a[i][j]);

        }

        printf("\n");

    }

}

void copyArr(int n, int a[][20], int b[][20]) {

    int i, j;

    for(i=0;i<n;i+=1) {

        for(j=0;j<n;j+=1) {

            a[i][j]=b[i][j];

        }

    }

}


void shuffleArr(int n, int a[][20]) {

    int r, c, i, j, x;

    int buf[20];

    for(i=0;i<n;i+=1) {

        r=rand()%n;

        for(j=0;j<n;j+=1) {

            x=a[i][j];

            a[i][j]=a[r][j];

            a[r][j]=x;

        }

    }

    for(i=0;i<n;i+=1) {

        c=rand()%n;

        for(j=0;j<n;j+=1) {

            x=a[j][i];

            a[j][i]=a[j][c];

            a[j][c]=x;

        }

    }       

}


int main() {

    int arr[20][20], brr[20][20], crr[20][20], drr[20][20];

    int baseArr[20][20];

    int i, j, k=2, n=20, t, x, z=0;


    srand(time(NULL));

    small(10, arr);

    small(10, brr);

    small(10, crr);

    small(10, drr);

    for(i=0;i<10;i+=1) {

        for(j=0;j<10;j+=1) {

            baseArr[i][j]=arr[i][j];

            baseArr[i][j+10]=crr[i][j]+10;

            baseArr[10+i][j]=drr[i][j]+10;

            baseArr[10+i][10+j]=brr[i][j];

        }

    }

    printArr(n, baseArr);

    copyArr(n, arr, baseArr);

    for(i=0;i<n;i+=1) {

        shuffleArr(n, arr);

    }

    printf("\n");

    printArr(n, arr);


    return 0;

}


20x20행렬에 1부터 20까지를 각 행과 각 열에 각각의 수가 1번씩만 나타나게 섞는 방법.


꽤 힘들게 작성된 코드입니다. 10x10 행렬을 4개 먼저 구했습니다. (행과 열이모두 겹치지 않는)


AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

AAAAAAAAAA CCCCCCCCCC

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB

DDDDDDDDD BBBBBBBBBB


A, B, C, D 가 바로 그 행렬입니다.

A행렬과 B행렬은 1부터 10까지 변합니다.

C행렬과 D행렬응 11부터 시작해서 20까지 변합니다.


이를 행을 섞어주고, 또 열을 섞어주는 것을 충분히 많이 합니다.

그러면 원하는 방식으로 20x20행렬이 구해집니다.