반응형

수학에서의 "random walk"라 불리우는 문제를 배열을 이용하여 프로그래밍하여 보자. 문제는 다음과 같다. 술에 취한 딱정벌레가 nxm크기의 타일로 구성된 방안에 있다. 딱정벌레는 임의의(랜덤) 위치를 선택하여 여기저기 걸어 다닌다. 현재의 위치에서 주위의 8개의 타일로 걸어가는 확률은 동일하다고 가정하자. 그러면 최종적인 문제는 "딱정벌레가 방안의 모든 타일을 한 번씩 지나가는데 걸리는 총 이동수는 얼마인가?"이다.


필자는 7X7 크기의 타일에서 파리가 돌아다닌다고 가정하였다. 이동한도는 700으로 하였다.

그리고 아마 더 좋은 프로그래밍 방법이 있을 것이라고 생각한다. 나는 전역변수를 사용하였는데 이는 별로 좋지 않은 방법 같다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 7
int check(int a[][SIZE]);
int cant_go(int number);
void move(int number);
int i,j,count;
 
int main(void)
{
    int a[SIZE][SIZE]={{0},{0}};
    int x,y,number;
    srand((unsigned)time(NULL));
    i=3;j=3;count=0;
    while(1)
    {    a[i][j]=1;
        x=check(a);
        if(count>700)
        {printf("이동횟수초과\n");
        break;
        }
    if(x==1)
    {printf("딱정벌레가 움직인 횟수: %d\n", count);
    break;}
    number=rand()%8;
    y=cant_go(number);
    if(y==0)
        continue;
    move(number);
    }
    return 0;
}
int check(int a[][SIZE])
{
    int i,j;
    for(i=0;i<SIZE;i++)
        for(j=0;j<SIZE;j++)
            {if(a[i][j]==0)
            return 0;}
        return 1;
}
int cant_go(int number)
{
    if(i==0&&j==0)
    {if(number==1||number==0||number==7||number==6||number==5)
    return 0;}
    else if(i==0&&j==6)
    {if(number==7||number==0||number==1||number==2||number==3)
    return 0;}
    else if(i==6&&j==0)
    {if(number==7||number==6||number==5||number==4||number==3)
    return 0;}
    else if(i==6&&j==6)
    {if(number==1||number==2||number==3||number==4||number==5)
    return 0;}
    else if(i==0)
    {if(number==7||number==0||number==1)
    return 0;}
    else if(i==6)
    {if(number==5||number==4||number==3)
    return 0;}
    else if(j==0)
    {if(number==7||number==6||number==5)
    return 0;}
    else if(j==6)
    {if(number==1||number==2||number==3)
    return 0;}
    else
        return 1;
}
void move(int number)
{
    if(number==0)
    {i--;count++;}
    else if(number==1)
        {i--;j++;count++;}
    else if(number==2)
        {j++;count++;}
    else if(number==3)
        {i++;j++;count++;}
    else if(number==4)
        {i++;count++;}
    else if(number==5)
        {i++;j--;count++;}
    else if(number==6)
        {j--;count++;}
    else if(number==7)
        {i--;j--;count++;}
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

바이트 순서 알아보기  (0) 2016.08.14
에라스토테네스의 체  (0) 2016.08.14
2진수 변환기  (0) 2016.08.12
2차원 행렬  (0) 2016.08.12
재고 관리 시스템  (0) 2016.08.11

+ Recent posts