#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행렬이 구해집니다.
'c·c++ > c 프로그래밍' 카테고리의 다른 글
vc++ 2010 LNK1123: coff 변환오류 (0) | 2014.02.26 |
---|---|
c언어란 무엇인가요? - c언어 독학 가능한가요? (0) | 2014.02.22 |
Dijkstra's algorithm (0) | 2013.12.16 |
괴짜수(weird number) 출력하기 (0) | 2013.12.02 |
유사완전수,괴짜수 (0) | 2013.12.01 |