随机走动问题

     随机走动问题是一大类问题的总称,引得数学界兴趣旺盛,且经久不衰。除了一些特例外,这个问题是出奇的难题,大部分迄今为止都不能解决。下面是随机走动问题中的一个:

一只贪杯的蟑螂,熏熏然在室内游荡。地面铺满方砖,共计n×m块,构成大面积矩阵。蟑螂在方砖间随机爬行,可能撞大运,照片阿司匹林解酒,这里按下不表。假定蟑螂从房间中央一块方砖出发,除非撞墙,可以爬向相邻8块方砖中的任意一个,且机会相等。问蟑螂多久才能在所有方砖上留下足迹?

用计算机求解的方法称为“仿真”,具有极广泛的应用领域。下面看看蟑螂问题的仿真:

n×m的数组count记录蟑螂爬过的每块方砖的次数,数组每个单元的初始值设为0,蟑螂当前坐标为ibugjbug表示,下一个移动目标是(ibug + imove[k], jbug + jmove[k]),0<= k<=7,

imove[0] = -1      jmove[0] = -1 

imove[1] = 0  jmove[1] = 0

imove[2] = 1  jmove[2] = 1 

imove[3] = -1  jmove[3] = -1 

imove[4] = 0      jmove[4] = 0

imove[5] = 1 jmove[5] = 1

imove[6] = -1     jmove[6] = -1 

imove[7] = 0      jmove[7] = 0 

蟑螂爬向的下一个目标是相邻的8块方砖之一,仿真时每次产生一个07的随机数存放在变量k中。因为蟑螂不会爬出房间,如果产生的随机数对应的坐标撞墙,则忽略不计,产生下一个新随机数继续。蟑螂爬到任意方砖,他的计数值都要加1,记录蟑螂爬过的次数。程序运行直到蟑螂爬过所有的方砖至少一次。

编程完成以下练习。

My Answer: 

platform tc 2.0

#include <stdio.h>

#include <time.h>

#define ROWS 10  /*房间的大小*/

#define COLS 10

int room[ROWS][COLS];     

int ibug, jbug;                     /*当前蟑螂的位置*/

void Initial()                      /*初始化矩阵,即房间*/

{

int i, j;

for(i = 0; i < ROWS; i++)        /*墙壁用-1表示,方砖用0表示*/

for(j = 0; j < COLS; j++)

{

room[i][j] = 0;

}

for(i = 0; i < ROWS; i++)

{

room[i][0] = -1;

room[i][COLS - 1] = -1;

}

for(j = 0; j < COLS; j++)

{

room[0][j] = -1;

room[ROWS - 1][j] = -1;

}

}

void Print()                    /*打印方砖,蟑螂走过的足迹*/

{

int i, j;

for(i = 0; i < ROWS; i++)

{

for(j = 0; j < COLS; j++)

{

printf("%4d",room[i][j]);

}

putchar('/n');

}

}

int judge()

{

int i, j;

for(i = 1; i < ROWS - 1; i++)

{                            /*判断如果矩阵中仍有0则继续,flag设为1*/

for(j = 1; j < COLS - 1; j++)

if(room[i][j] == 0)

{

return 0;

}

}

return 1;

}

void ChooseStart()  /* 自己选择蟑螂起始点*/

{

do                   

{

printf("%d row, %d col/n Choose startpoint : ", ROWS, COLS);

scanf("%d %d", &ibug, &jbug);

if(ibug <= 0 && ibug > ROWS -1 && jbug <= 0 && jbug > COLS - 1)

printf("%d, %d Out of range!/n", ibug, jbug);

}while(ibug <= 0 && ibug > ROWS -1 && jbug <= 0 && jbug > COLS - 1);

int main(void)

{

int i, j; /*i,j, ibug,jbug都是记录当前蟑螂的位置,ij用以比较*/

int newibug, ne**ug;        /*newibugne**ug记录蟑螂的新位置*/

int ik, jk;                 /*ikjk是记录新生成蟑螂位置的临时量*/

long count = 0;            /*记录循环的次数*/

time_t start = time(NULL);    //*开始时间*/

clrscr();

srand((unsigned)time(NULL));

ChooseStart();

i = ibug;

j = jbug;

Initial();                   /*初始化矩阵*/

room[ibug][jbug]++;         /*将蟑螂所在位置设为1*/

Print(); /*打印矩阵*/

newibug = ibug;

ne**ug = jbug;

while(count < 50000)          /*最多循坏次数为50000*/

{

count++;

do /*随机生成蟑螂下一个爬行位置*/

{

ik = ibug + (-1 + rand() % 3);

jk = jbug + (-1 + rand() % 3);

if(room[ik][jk] < 0)

continue;

if(ik == ibug && jk == jbug)

continue;

ibug = ik;

jbug = jk;

}while(i == ibug && j == jbug);

newibug = ibug;

ne**ug = jbug;

i = ibug;

j = jbug;

room[newibug][ne**ug]++;           /*爬到的位置加1*/

clrscr();

Print();

if(Judge())

break;

}

/*打印总共花费的时间*/

printf("Running time is %.2lf/n", (double)(time(NULL) - start));

getch();

return 0;

}

我设置的是10×10面积,运行时间一般在5秒左右。

理论上可以解决这个问题,但是当行列太大时,程序会运行的特别慢。

如果有兴趣,可以把行列换成39×20的,你就会知道什么叫做程序跑不过乌龟了。呵呵。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值