#include <stdio.h>
#include <stdlib.h>
#include <time.h>
// board 의 내용을 화면에 보여줍니다.
void showboard(int b[]) {
int i;
system("cls");
for(i=0;i<9;++i) {
if(b[i]==0) printf(" *");
else printf("%2d", b[i]);
if((i+1)%3==0) printf("\n");
}
}
int main() {
// 처음에 보드에 초기값을 넣습니다.
int board[9]={1,2,3,4,5,6,7,8,0};
// 0이 위로 가는 것은 1로 나타내고, == mapp에서는 1
// 0이 오른쪽으로 가는 것은 2로 나타내고 == mapp에서는 2
// 0이 아래로 가는 것은 3으로 나타내고 == mapp에서는 4
// 0이 왼쪽으로 가는 것은 4로 타나냅니다.== mapp에서는 8 로 나타냅니다.
int mapp[5]={0,1,2,4,8};
// mchk는 각위치에서 허용되는 move를 구하기 위해서
// 모두가 허용되면 (1+2+4+8) 15로 나타내고,
// 오른쪽과 아라쪽이 허용되면 (2+4) 6으로 나타냅니다.
// 9개 위치에 따라서 허용되는 것을 모두 mchk 로 나타내었습니다.
int mchk[9]={6,14,12,7,15,13,3,11,9};
// move는 위로 가는 것은 인덱스가 3감소하고
// 오른쪽으로 가는 것은 인덱스가 1증가하고
// 아래로 가는 것은 인덱스가 3증가하고
// 왼쪽으로 가는 것은 인덱스가 1감소하는 것을 나타냅니다.
int move[5]={0,-3,1,3,-1};
// 처음 출발할때 위치는 8입니다. (0,1,2,3,4,5,6,7,8)
int pos=8;
// 난수를 생성시켜서 실제로 퍼즐을 움직이는 것처럼 움직입니다.
// 500회를 옮겼습니다.
int x, y, i, j, n=500;
srand(time(NULL));
i=0;
showboard(board);
while(i<n) {
j=rand()%4+1;
if(mapp[j]&mchk[pos]) {
x=pos+move[j];
y=board[x];
board[x]=board[pos];
board[pos]=y;
pos=x;
}
i=i+1;
if(i%10==0) showboard(board);
}
return 0;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
세원이 만나는 점 구하기 (0) | 2012.11.14 |
---|---|
일정시간이 지나면 scanf를 취소하기. (0) | 2012.11.14 |
행렬의 최대 사각형의 합(max sum of rectangle) (0) | 2012.11.05 |
큰정수의 덧셈과 뺄셈(진행중) (0) | 2012.11.05 |
피보나치-어린토끼,어른토끼 (0) | 2012.10.20 |