读书人

关于迷宫有关问题~各位请帮帮忙啊

发布时间: 2012-02-27 10:00:22 作者: rapoo

关于迷宫问题~~~急,各位请帮帮忙啊~
基本要求:
要求程序输出如下:
1 一条通路的二元组(i,j),数据序列(i,j)表示通路上某点的坐标。
2 用一种标志(如数字0)在二维数组中标出该条通路,并在屏幕上输出二维组。
实现提示:
可以用二维数组m[i][j]表示迷宫,其中1 <= i <= m,1 <= j <= n。数组元素为1表示该位置是墙壁不能通行,元素值为0表示该位置是通路。假定从 m[1][1]出发,出口位于m[m][n],移动方向可以是8个方向(东,东南,南,西南,西,西北,北和东北)。一个购造的迷宫如下:
0 1 0 1 0 0 1
1 0 0 0 1 0 1
0 0 1 1 0 1 1
1 1 1 0 1 1 0
0 1 1 1 0 1 0
1 1 1 0 1 0 0


各位能 给我个c程序 和解决方案么?~~

[解决办法]
这个用回溯法

[解决办法]
课程设计吧,

网上这方面的代码不少,

自己找找看吧
[解决办法]
贪心法,每次找到一个出口就向前一步,如果没有出路了就回溯,用堆栈
[解决办法]
刚好我有时间就随便写了写,用的是c代码,主要是用递归了:


#include "stdafx.h "
#include <stdio.h>
typedef char BOOL;

//迷宫算法
const int a[6][7] = {
{0, 1, 0, 1, 0, 0, 1},
{1, 0, 0, 0, 1, 0, 1},
{0, 0, 1, 1, 0, 1, 1},
{1, 1, 1, 0, 1, 1, 0},
{0, 1, 1, 1, 0, 1, 0},
{1, 1, 1, 0, 1, 0, 0}
};

const int MAX_X = 6;
const int MAX_Y = 7;

//每一步在数组中的位置
typedef struct _STEP
{
//::memset(this, 0, sizeof(_STEP));
int x;
int y;
}Step;

//当前位置
Step trace[50];
Step stepCurrent;
int iCounter;

//移动操作
BOOL Right();
BOOL RightDown();
BOOL Down();
BOOL DownUp();
BOOL Left();
BOOL LeftUp();
BOOL Up();
BOOL UpDown();
//
BOOL GetExit();

void main()
{
stepCurrent.x = 0;
stepCurrent.y = 0;
iCounter = 0;

if (GetExit())
{
printf( "Successful! ");
}

scanf( "%d ", &iCounter);
}

BOOL GetExit()
{
//8个方向从Right开始逆时针运动
trace[iCounter++] = stepCurrent;

if (stepCurrent.x == MAX_X-1
&& stepCurrent.y == MAX_Y-1)
{
return 1;
}

if (Right())
{
return GetExit();
}
else
{
Left();
}

if (RightDown())
{
return GetExit();
}
else
{
LeftUp();
}

if (Down())
{
return GetExit();
}
else
{
Up();
}

if (DownUp())
{
return GetExit();
}
else
{
UpDown();
}

if (Left())
{
return GetExit();
}
else
{
Right();
}

if (LeftUp())
{
return GetExit();
}
else
{
RightDown();
}

if (Up())
{
return GetExit();
}
else
{
Down();
}

if (UpDown())
{
return GetExit();
}
else
{
DownUp();
}

iCounter--;
return 0;
}

BOOL Right()
{
if (++stepCurrent.y > = MAX_Y
|| a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}

BOOL RightDown()
{
if (++stepCurrent.y > = MAX_Y


|| ++stepCurrent.x > = MAX_X
||a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}

BOOL Down()
{
if (++stepCurrent.x > = MAX_X
|| a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}

BOOL DownUp()
{
if (--stepCurrent.y > = MAX_Y
|| ++stepCurrent.x > = MAX_X
||a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}

BOOL Left()
{
if (--stepCurrent.y > = MAX_X
|| a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}

BOOL LeftUp()
{
if (--stepCurrent.y > = MAX_Y
|| --stepCurrent.x > = MAX_X
||a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}

BOOL Up()
{
if (--stepCurrent.x > = MAX_X
|| a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}

BOOL UpDown()
{
if (++stepCurrent.y > = MAX_Y
|| --stepCurrent.x > = MAX_X
||a[stepCurrent.x][stepCurrent.y])
return 0;

return 1;
}
[解决办法]
用一个最笨的方法,始终让你的右手(左手)摸到墙,最后一定能出去,不过很有可能不是最短路线
[解决办法]
呵呵,最后的方法估计是最实用的!大家迷路的时候可不要听程序员的,就按最后一个老兄说的办.

读书人网 >C++

热点推荐