求递归算法

firefly3233 2012-12-05 11:11:25

一块内存,如:
BYTE* pWalk = new BYTE[cx * cy];
cx,cy为地图的宽和高,那么这个内存的一个BYTE对应地图的一个x,y,在某个x,y处,我用上图的顺序进行搜索,如果发现某点的值为nWalk,则函数返回找到的位置n = y * cx + x,否则返回-1,不管函数返回何值,输入参数x,y都要变化到相应位置.我用得的笨方法(以两层为例,如果这个层次为m,则数组很长):

int SeekWalk(int cx, int cy, int& x, int& y, BYTE nWalk, BYTE* pWalk)
{
int n = -1;
BOOL bSeek = FALSE;
BYTE flagMove[] = {0,1,1,2,2,3,3,4,4,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,0};
for (int i = 0; i < sizeof(flagMove); i ++)
{
switch (flagMove[i])
{
case 0:
x --; y --; break;
case 1:
x ++; break;
case 2:
y ++; break;
case 3:
x --; break;
case 4:
y --; break;
}
n = y * cx + x;
if (nWalk == pWalk[n]) {bSeek = TRUE; break;}
}
return bSeek ? n : -1;
}

如果不用数组的笨方法,用递归算法,是不是效率更高?
...全文
185 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
firefly3233 2012-12-07
  • 打赏
  • 举报
回复
你的坐标变化代码呢?
hztj2005 2012-12-07
  • 打赏
  • 举报
回复
我当然知道汇编后的结果是一样的。但在vc上,至少代码简洁多了,还少了switch判断。
firefly3233 2012-12-06
  • 打赏
  • 举报
回复
有没有更好的办法,如果层数不定,数组又要加长了..
firefly3233 2012-12-06
  • 打赏
  • 举报
回复
你看过转换为机器码的EXE吗?二维最终也是用一维来访问的,pWalk[i][j]会和pWalk[n]结果一样,都是: pWalk[i*cx+j]
hztj2005 2012-12-06
  • 打赏
  • 举报
回复
如果pWalk[n]直接定义为二维数组pWalk[k][g],然后 for(int i = 0; i < k ; i ++) { for(int j = 0; j < g; j ++) { if (pWalk[i][j] == nWalk) {i = nCount; break;} } } 更快更简洁。
firefly3233 2012-12-06
  • 打赏
  • 举报
回复
上面的算法有BUG,这下好了:

int SeekWalk(int cx, WORD& x, WORD& y, int nFloor, BYTE nWalk, BYTE* pWalk)
{
	int n = -1;
	BOOL bSeek = FALSE;
	int nCount = nFloor * 5 + 1;
	for(int i = 0; i < nCount && !bSeek; i ++)
	{
		int nFlag = i % 5;
		int nRepeat = 2 * (i / 5 + 1);	
		for(int j = 0; j < nRepeat; j ++)
		{
			switch (nFlag)
			{
			case 0:
				x --; y --; j = nRepeat; break;
			case 1:
				x ++; break;
			case 2:
				y ++; break;
			case 3:
				x --; break;
			case 4:
				y --; break;
			}
			n = y * cx + x;
			if (pWalk[n] == nWalk) {bSeek = TRUE; break;}
		}
	}
	return bSeek ? n : -1;
}
  • 打赏
  • 举报
回复
把你的要求发到我邮箱里面,就是具体的要求,明天给你代码
firefly3233 2012-12-06
  • 打赏
  • 举报
回复
下面这个算法是不是适应性更强点?

int SeekWalk(int cx, WORD& x, WORD& y, int nFloor, BYTE nWalk, BYTE* pWalk)
{
	int n = -1;
	int nCount = nFloor * 5 + 1;
	for(int i = 0; i < nCount ; i ++)
	{
		int nFlag = i % 5;
		int nRepeat = 2 * (i / 5 + 1);	
		for(int j = 0; j < nRepeat; j ++)
		{
			switch (nFlag)
			{
			case 0:
				x --; y --; j = nRepeat; break;
			case 1:
				x ++; break;
			case 2:
				y ++; break;
			case 3:
				x --; break;
			case 4:
				x --; break;
			}
			n = y * cx + x;
			if (pWalk[n] == nWalk) {i = nCount; break;}
		}
	}
	return n;
}
hztj2005 2012-12-05
  • 打赏
  • 举报
回复
递归算法只能使程序看起来简洁,但由于函数调用中stack操作,效率会更低。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧