#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
void main() {
int row =0;
int col = 0;
int i;
int j;
while(1) {
printf("타일의 크기를 입력 \n");
printf(">>"); // 타일의 크기를 작게(10 10) 주고 돌려봅니다.
scanf_s("%d %d",&row,&col);
if(row > 1 && col >1) break;
else printf("잘못 입력 \n");
}
int **arr;
arr =(int **)malloc(row*sizeof(int*));
for(i=0;i<row;i++)
arr[i]=(int*)malloc(col*sizeof(int));
for(i=0;i<row;i++)
ZeroMemory(arr[i], sizeof(int)*col);
srand(time(NULL));
int nowRow = row/2;
int nowCol = col/2;
float lastTime = time(NULL);
int Move =0;
while(1) {
int noMoveTileCount = 0;
//nowRow=nowRow%row;
//nowCol=nowCol%col;
arr[nowRow][nowCol] = 2;
//■ = 지나가지않은 타일
//@ = 지난간 타일
//□ = 현재위치
for(i=0; i<row; i++){
for(j=0; j<col; j++){
if(1==arr[i][j]){
printf("□");
}
else if(2== arr[i][j]){
printf("@");
Move++;
}
else{
printf("■");
noMoveTileCount++;
}
}
printf("\n");
}
printf("------------\n");
getchar(); // 어떻게 동작하는지 이해하고 나면 코멘트로 막아 줍니다.
if(0 == noMoveTileCount) {
break;
}
arr[nowRow][nowCol] = 1;
// 지금 현재위치에서 갈수 있는 곳이 8군데 있습니다.
// 현재 위치를 x라고 하고 나머지 위치를 표시해 보겠습니다.
// 0 1 2
// 3 x 4
// 5 6 7
// 이렇게 고쳐서 프로그램을 수정하였습니다.
// 다음 위치로 모든 곳에 갈수 있다는 뜻으로 isMove[8]에 모두 true를 넣었습니다.
// 만약 가장 윗줄에 현재 위치가 있다면 0,1,2의 위치로는 갈수가 없습니다.
// 이것을 나타내기 위해서 nowRow==0 일 경우에는 0,1,2 칸에 false 를 넣은 것입니다.
// 만약 마지막 줄에 현재 위치가 있다면 5,6,7의 위치로는 갈수가 없습니다.
// 만약 가장 왼쪽에 현재 위치가 있다면 ( nowCol==0 ) 0,3,5의 칸에 false를 넣었습니다.
// 마지막으로 가장 오른쪽에 현재 위치가 있다면 2,4,7의 칸에 false를 넣었습니다.
bool isMove[8];
for(i=0;i<8;++i) isMove[i]=true;
if(0==nowRow) {
isMove[0] =false;
isMove[1] =false;
isMove[2] =false;
}
else if(row-1 ==nowRow) {
isMove[5] =false;
isMove[6] =false;
isMove[7] =false;
}
if(0==nowCol) {
isMove[0] =false;
isMove[3] =false;
isMove[5] =false;
}
else if(col-1==nowCol) {
isMove[2] =false;
isMove[4] =false;
isMove[7] =false;
}
int isMoveCount=0;
for(i=0;i<8;i++) {
if(true==isMove[i]) {
isMoveCount++;
}
}
int temp=rand();
int randNum=rand()%isMoveCount;
int selectNum=0;
for(i=0;i<8;i++) {
if(true==isMove[i]) {
if(0==randNum) {
selectNum =i;
}
randNum--;
}
}
switch(selectNum) {
case 0: // 0이면 위쪽,왼쪽 대각선으로 갑니다. nowRow와 nowCol이 모두 1이 줍니다.
nowRow--;
nowCol--;
break;
case 1: // 1이면 위쪽으로 갑니다. nowRow가 1이 줍니다.
nowRow--;
break;
case 2: // 2이면 위쪽,오른쪽 대각선으로 갑니다. nowRow는 줄고, nowCol은 늡니다.
nowRow--;
nowCol++;
break;
case 3: // 3이면 왼쪽으로 갑니다.
nowCol--;
break;
case 4: // 4이면 오른쪽으로 갑니다.
nowCol++;
break;
case 5: // 5이면 아래쪽,왼쪽으로 갑니다.
nowRow++;
nowCol--;
break;
case 6: // 6이면 아래쪽으로 갑니다.
nowRow++;
break;
case 7: // 7이면 아래쪽, 오른쪽으로 갑니다.
nowRow++;
nowCol++;
break;
}
}
float currTime = time(NULL);
float deltaTimelnSecond = (currTime - lastTime)*0.001;
printf(" 이동횟수 : %d\n", Move);
printf("\n 걸린시간 : %.3f초 \n", deltaTimelnSecond);
for(i=0;i<row;i++)
free(arr[i]);
free(arr);
system("PAUSE");
return;
}
'c·c++ > c 프로그래밍' 카테고리의 다른 글
부분집합의 합 (0) | 2012.09.19 |
---|---|
최대약수구하기-순환호출 (0) | 2012.09.19 |
파일에서 읽어서 단순 연결리스트 만들기 (0) | 2012.09.16 |
eigenvalue for 3x3 matrix (0) | 2012.08.29 |
printf() 출력 결과에 대해서 어셈블리어 관련시켜 설명 부탁드립니다. (0) | 2012.08.23 |