随机走动问题是一大类问题的总称,引得数学界兴趣旺盛,且经久不衰。除了一些特例外,这个问题是出奇的难题,大部分迄今为止都不能解决。下面是随机走动问题中的一个:
一只贪杯的蟑螂,熏熏然在室内游荡。地面铺满方砖,共计n×m块,构成大面积矩阵。蟑螂在方砖间随机爬行,可能撞大运,照片阿司匹林解酒,这里按下不表。假定蟑螂从房间中央一块方砖出发,除非撞墙,可以爬向相邻8块方砖中的任意一个,且机会相等。问蟑螂多久才能在所有方砖上留下足迹?
用计算机求解的方法称为“仿真”,具有极广泛的应用领域。下面看看蟑螂问题的仿真:
用n×m的数组count记录蟑螂爬过的每块方砖的次数,数组每个单元的初始值设为0,蟑螂当前坐标为ibug,jbug表示,下一个移动目标是(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块方砖之一,仿真时每次产生一个0到7的随机数存放在变量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都是记录当前蟑螂的位置,i,j用以比较*/
int newibug, ne**ug; /*newibug,ne**ug记录蟑螂的新位置*/
int ik, jk; /*ik,jk是记录新生成蟑螂位置的临时量*/
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的,你就会知道什么叫做程序跑不过乌龟了。呵呵。