注册 登录
编程论坛 新人交流区

[求助]想编一个醉汉走路程序!

hzwnk 发布于 2007-11-04 10:26, 4068 次点击
从随机函数生成一个0~1的值,若值为0~0.25,则向上走,0.25~0.5,向右走,0.5~0.75向下走,0.75~1向左走
走过了的点不能在走,求走1000步后的轨迹。
又会的麻烦帮帮忙!!谢谢!
45 回复
#2
nigma2007-11-04 10:47
是要显示在form上吗
#3
作弊2007-11-04 10:51
java的随机数就是0-1内的

你可以 int(Math.random()*4) 会生成 0 1 2 3

或者在C里面用enum

typedef enum {UPWARD, RIGHTWARD, DOWNWARD, LEFTWARD } TOWARDS;

然后可以用switch 选择对应的 function
#4
作弊2007-11-04 10:52

可以建立一个 Matrix 用来记录 那些点走过了 那些没有

如果遇到走过了的 则放弃进入 重新选择方向

BTW 万一走进了 一个死胡同 。。这个AI似乎。。

#5
zzj9362007-11-04 11:03
向高手学习啊
#6
seele6212007-11-04 12:18

。。。。

#7
seele6212007-11-04 12:19

不懂

#8
rzbcs2007-11-04 13:55

哈哈,有想法

#9
hzwnk2007-11-04 16:45
还是不太懂,我只会C++.初始想设个数组,每次走完后把点放进去,而每次走之前则与数组中每一个元素比较,但是这样效率很低!还有,C++中的随机函数真没用过,谁能说说如何产生0~1间的数呢?谢谢!
#10
hzwnk2007-11-04 16:46
以下是引用hzwnk在2007-11-4 10:26:45的发言:
从随机函数生成一个0~1的值,若值为0~0.25,则向上走,0.25~0.5,向右走,0.5~0.75向下走,0.75~1向左走
走过了的点不能在走,求走1000步后的轨迹。
又会的麻烦帮帮忙!!谢谢!

倘若要显示,如何能做得到?谢谢!!

#11
wdq1972007-11-04 16:52
回复:(hzwnk)[求助]想编一个醉汉走路程序!
LZ也是初学者吗?
#12
hzwnk2007-11-04 17:04
以下是引用wdq197在2007-11-4 16:52:40的发言:
LZ也是初学者吗?

可以这么说!曾经几年前学过两个学期,现在都忘光了。

#13
giant6112007-11-04 17:35
死了都要学
#14
hzwnk2007-11-05 09:20
以下是引用hzwnk在2007-11-4 16:45:17的发言:
还是不太懂,我只会C++.初始想设个数组,每次走完后把点放进去,而每次走之前则与数组中每一个元素比较,但是这样效率很低!还有,C++中的随机函数真没用过,谁能说说如何产生0~1间的数呢?谢谢!

有人能回答一下这个问题吗?想过用指针,但感觉很容易出错。

#15
hzwnk2007-11-05 11:21

我自己编了一下,不会显示轨迹,还有随机函数也不知道对不对,请高人指点指点:
#include<iostream.h>
void main()
{ int x=0,y=0,i,c;
float t;
int *p;
int a[1000];
*p=&a;
for(i=0;i<=100;i++)
{ t=rand();
if(0<t<=0.25)
{ y++;
c=cmp(x,y);
if(c)
{ a[i]={(x,y)};
p++;
}
}
if(0<t<=0.5)
{ x++;
c=cmp(x,y);
if(c)
{ a[i]={(x,y)};
p++;
}
}
if(0.5<t<=0.75)
{ y--;
c=cmp(x,y);
if(c)
{ a[i]={(x,y)};
p++;
}
}
if(0.75<t<=1.0)
{ x--;
c=cmp(x,y);
if(c)
{ a[i]={(x,y)};
p++;
}
}
}
}

int cmp(j,k)
{ int j,k;
strcmp( (j,k),*p);
}

#16
信飞鸟2007-11-05 11:33
强人
#17
renwolin2007-11-05 11:48

不太懂,学习中

#18
wdm1152007-11-05 12:21
#19
yanwenlong2007-11-05 14:47
好弄,好弄
#20
crazy01wind2007-11-05 14:57
路过,帮顶
#21
LOvE老鼠YoU2007-11-05 15:01
不懂, 向高手学习,
我连用什么东西编 程序都不知道
#22
hzwnk2007-11-05 18:38
以下是引用LOvE老鼠YoU在2007-11-5 15:01:17的发言:
不懂, 向高手学习,
我连用什么东西编 程序都不知道

晕。。。。

#23
pipifei1992007-11-05 18:48
是醉汉随机游走模型吗?呵呵,不太懂,是在书上看见过的!
#24
hzwnk2007-11-05 20:05
以下是引用pipifei199在2007-11-5 18:48:10的发言:
是醉汉随机游走模型吗?呵呵,不太懂,是在书上看见过的!

现在只能在新手区发帖。。。。郁闷啊。。。。

#25
yiyang2007-11-05 22:12
一点也看不懂
#26
csfeng2007-11-05 22:37
有意思 怎么显示呢&gt;???
#27
一水先生2007-11-05 22:48
有意思,可以考虑一下
#28
woaiwuhai2007-11-05 22:49
复杂搞不明白
#29
hzwnk2007-11-06 08:40
以下是引用csfeng在2007-11-5 22:37:45的发言:
有意思 怎么显示呢>???

我也在想!!这是个明天就要交的东西!急啊!我之前编了一个程序,怎么没高手帮我看看呢!!郁闷啊!

#30
halei132007-11-06 09:13
学习。。。
#31
springey5202007-11-06 09:18
没看明白
#32
wangmingqun2007-11-06 10:03
    继续关注!向高人学习啊。
#33
紫色天空2007-11-06 10:30
以下是引用wangmingqun在2007-11-6 10:03:56的发言:
继续关注!向高人学习啊。

#34
Empyrean2007-11-06 10:36

有没有具体点的

#35
jacky_gao2007-11-06 13:28
#36
openzzj2007-11-06 13:58
回复:(hzwnk)[求助]想编一个醉汉走路程序!
不懂那个语言啊,唉
#37
tommi2007-11-06 16:55

随便写了一个垃圾的, 你参考看考
import java.math.BigDecimal;

class DrinkedWalker {
static void walk(int[][] road) {
int x = 0, y = 0;

for (int i = 0; i < 1000; i++) {
double randomNum = Math.random();

BigDecimal b = new BigDecimal(randomNum);
float roundNum = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
String strDirect = Long.toString(Math.round(roundNum / 0.25));
int direction = Integer.parseInt(strDirect);

int tmpX = x, tmpY = y;
switch(direction) {
case 0:
case 1:
x = x - 1;
break;
case 2:
y = y + 1;
break;
case 3:
x = x + 1;
break;
default:
y = y - 1;
}

if (x >= 0 && y >= 0 && road[x][y] != 1) {
road[x][y] = 1;
} else {
System.out.println("Stop at x=" + tmpX + "; y=" + tmpY);
return;
}
}

System.out.println("Stop at x=" + x + "; y=" + y);
return;
}

public static void main(String[] args) {
int[][] road = new int[100][100];

for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
road[i][j] = 0;
}
}

walk(road);
}

}

#38
fu34903142007-11-06 20:43
学习学习
#39
yangl25125122007-11-06 23:34
似乎看不怎么明白~~~
#40
hzwnk2007-11-07 10:27
以下是引用tommi在2007-11-6 16:55:40的发言:

随便写了一个垃圾的, 你参考看考
import java.math.BigDecimal;

class DrinkedWalker {
static void walk(int[][] road) {
int x = 0, y = 0;

for (int i = 0; i < 1000; i++) {
double randomNum = Math.random();

BigDecimal b = new BigDecimal(randomNum);
float roundNum = b.setScale(2, BigDecimal.ROUND_HALF_UP).floatValue();
String strDirect = Long.toString(Math.round(roundNum / 0.25));
int direction = Integer.parseInt(strDirect);

int tmpX = x, tmpY = y;
switch(direction) {
case 0:
case 1:
x = x - 1;
break;
case 2:
y = y + 1;
break;
case 3:
x = x + 1;
break;
default:
y = y - 1;
}

if (x >= 0 && y >= 0 && road[x][y] != 1) {
road[x][y] = 1;
} else {
System.out.println("Stop at x=" + tmpX + "; y=" + tmpY);
return;
}
}

System.out.println("Stop at x=" + x + "; y=" + y);
return;
}

public static void main(String[] args) {
int[][] road = new int[100][100];

for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
road[i][j] = 0;
}
}

walk(road);
}

}

请问高手用那种语言编的?Java?大概能看懂,只是有些命令语句没见过。

#41
gaolf20062007-11-08 10:23
有个马赛克的程序可以利用一下,只取产生的前两个数,如果第一个数和上一步相反,也就是走了回头路,就选择第二个数
#42
weilili2007-11-08 11:22
呵呵,来看看而已
#43
liuxianen2007-11-08 11:31
回复:(hzwnk)[求助]想编一个醉汉走路程序!
matlab写会简单很多
#44
不离不弃2007-11-08 12:02

来学习的,C的随机数没弄过,高手说说吧!

#45
codelet2007-11-20 22:16

看看我写的,vc6编译通过,在文本模式下正常显示,本人觉得有很多地方写的不好,请大虾们指教
定义三个函数:void delayTime(int k); void gotoxy(int x, int y); void drunker();

为了方便判断是否进入死胡同,我用了“在可移动区四面加一堵墙”的方法。


#include <iostream>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <windows.h>

#define WIDTH 80 //dos窗口的宽度
#define HEIGHT 25 //标准dos窗口的高度

using namespace std;

//控制光标
void gotoxy(int x, int y)
{ COORD c;
c.X = x - 1;
c.Y = y - 1;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

//精确度为秒的定时器
void delayTime(int k)
{
int i = 0, j = 0;
time_t start, end;
start = time(0);
while(k > i)
{
end = time(0);
i = int(end - start);
if(i == j)
continue;
else
j = i;
}
}

void drunker()
{
int a[WIDTH+2][HEIGHT+2];
int x , y, dx = 0, dy = 0, ch = '*', t = 0;
int i = 0, j = 0;
bool isImpasse = 0;
for (i = 0; i < WIDTH + 2; i++)
for (j = 0; j < HEIGHT + 2; j++)
a[i][j] = 0;
//生成一堵墙
for ( i = 0; i < WIDTH + 2; i ++)
a[i][0] = a[i][HEIGHT + 1] = 1;
for (i = 0; i < HEIGHT + 2; i ++)
a[0][i] = a[WIDTH + 1][i] = 1;
//随机初始点
srand(time(0));
x = rand() % WIDTH + 1;
y = rand() % HEIGHT + 1;
gotoxy(1, 26);
cout << " 初始点是:(" << x << "," << y << ") " << endl;
gotoxy(x, y);
putchar(ch);
a[x][y] = 1;
while( !isImpasse) //还没有到死胡同时循环
{
switch(t = rand() % 4)
{
case 0:
dx = 0; dy = -1; ch = 24;
break;
case 1:
dx = 0; dy = 1; ch = 25;
break;
case 2:
dx = -1; dy = 0; ch = 27;
break;
case 3:
dx = 1; dy = 0; ch = 26;
break;
}
if( a[x+dx][y+dy] == 0) // 如果下个点没走过
{
gotoxy(x + dx, y + dy);
a[x+dx][y+dy] = 1;
putchar(ch);
x += dx;
y += dy;
gotoxy(x, y);
delayTime(1); //定时1秒
}
//判断是否是死胡同
if((a[x+1][y]== 1) && (a[x-1][y] == 1) && (a[x][y-1] == 1) && (a[x][y+1] == 1))
isImpasse = true;
}
gotoxy(1, 27);
cout << endl << " 在点:(" << x << "," << y << ") 进入了死胡同! " << endl;
gotoxy(x, y);
getchar();
}
//主函数
int main()
{
drunker();
return 0;
}

[此贴子已经被作者于2007-11-21 9:16:41编辑过]

#46
zhouqingwuji2007-11-20 22:23
以下是引用hzwnk在2007-11-7 10:27:46的发言:

请问高手用那种语言编的?Java?大概能看懂,只是有些命令语句没见过。

当然是了

1