迷宫问题
来源:互联网 发布:网络运营任职资格 编辑:程序博客网 时间:2024/05/02 02:18
俺的递归还停留在计算阶乘的程度啊,把数据结构翻了出来,看了这个迷宫的问题,试着自己写了一个,我写的好麻烦啊,还是书上的答案简单啊,贴在后面了。
/*********************************************************************************************************
文件名称 : labyrinth.c
建立时间 : 2006-2-28 15:08
版权所有 : 东软股份大连分公司电信事业开发部
Author : 中介部.吴喆喆
文件描述 :
迷宫问题
修改记录 :
========================================================================================================
序号 修改日期 修改人 修改原因
*********************************************************************************************************/
#include <stdio.h>
#include <string.h>
#define BUFSIZ 1024
int map[8][7] = {
{1,1,1,1,1,1,1},
{1,0,1,0,0,0,1},
{1,1,0,1,1,0,1},
{1,1,0,1,1,0,1},
{1,1,1,0,1,1,1},
{1,0,0,1,0,1,1},
{1,1,1,1,0,0,1},
{1,1,1,1,1,1,1}
};
struct pos
{
int x;
int y;
};
int flag = 0; //是否找到了路径
void printmap(int *p)
{
int i,j;
int c=0;
for (i=0;i<56;i++)
{
printf("%2d", p[i]);
++c;
if (c%7==0)
{
printf("/n");
c=0;
}
}
}
/*locx和locy是当前的位置*/
int go(int locx, int locy)
{
int i;
int tr = 0;
struct pos fpos;
struct pos roads[8];
//printf("(%d, %d)/n", locx, locy);
if (locx == 6 && locy == 5)
{
//printf("(%d, %d)/n", locx, locy);
flag = 1;
return 1;
}
else
{
//searchroads(locx, locy);
//左
if (map[locx][locy-1] == 0)
{
fpos.x = locx;
fpos.y = locy-1;
roads[tr++] = fpos;
}
//左上
if (map[locx-1][locy-1] == 0)
{
fpos.x = locx-1;
fpos.y = locy-1;
roads[tr++] = fpos;
}
//上
if (map[locx-1][locy] == 0)
{
fpos.x = locx-1;
fpos.y = locy;
roads[tr++] = fpos;
}
//右上
if (map[locx-1][locy+1] == 0)
{
fpos.x = locx-1;
fpos.y = locy+1;
roads[tr++] = fpos;
}
//右
if (map[locx][locy+1] == 0)
{
fpos.x = locx;
fpos.y = locy+1;
roads[tr++] = fpos;
}
//右下
if (map[locx+1][locy+1] == 0)
{
fpos.x = locx+1;
fpos.y = locy+1;
roads[tr++] = fpos;
}
//下
if (map[locx+1][locy] == 0)
{
fpos.x = locx+1;
fpos.y = locy;
roads[tr++] = fpos;
}
//左下
if (map[locx+1][locy-1] == 0)
{
fpos.x = locx+1;
fpos.y = locy-1;
roads[tr++] = fpos;
}
printf("(%d, %d)/n", locx, locy);
if (tr == 0)
map[locx][locy] = 2;
//test
if (locx==2 && locy==5)
printmap(map[0]);
if (locx==3 && locy==5)
printmap(map[0]);
for (i = 0; i < tr; ++i)
{
//往下一步走, 之前要把当前位置由0变为2, 表示走过
map[locx][locy] = 2;
if (flag) //如果不在这里设置return, 那么就会打印所有的路径
return 1;
else
go(roads[i].x, roads[i].y);
}
}
}
main(void)
{
int m;
m = go(1,1);
//printf("%d/n", m);
}
书上的好的方法是:
int maze[8][7] = {
{1,1,1,1,1,1,1},
{1,0,1,0,0,0,1},
{1,1,0,1,1,0,1},
{1,1,0,1,1,0,1},
{1,1,1,0,1,1,1},
{1,0,0,1,0,1,1},
{1,1,1,1,0,0,1},
{1,1,1,1,1,1,1}
};
int way(int locx, int locy)
{
if (maze[6][5] == 2)
return 1;
else
{
if (maze[locx][locy] == 0) //û؟¹�
maze[locx][locy] = 2;
if (way(locx, locy-1))
return 1;
else if (way(locx+1, locy-1))
return 1;
else if (way(locx+1, locy))
return 1;
else if (way(locx+1, locy+1))
return 1;
else if (way(locx, locy+1))
return 1;
else if (way(locx-1, locy+1))
return 1;
else if (way(locx-1, locy))
return 1;
else if (way(locx-1, locy-1))
return 1;
else /*no way*/
{
maze[locx][locy] = 3;
return 0;
}
}
else
return 0;
}
}
int main()
{
int i,j;
way(1,1);
for (i=0;i<8;++i)
{
for (j=0;j<7;++j)
printf("[%d]", maze[i][j]);
printf("/n");
}
//printf("%d/n", maze[0][0]);
}
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题...
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 迷宫问题
- 只有你能欣赏我(非常感动,所以转载)
- 使用Swing Worker线程 --执行后台任务的新方法
- 谈谈计算数学
- Function Run Fun(ZJU_1168)
- sizeof
- 迷宫问题
- 本是同根生,相煎何太急
- 世界第一数学强校的背后
- 爱因斯坦的一生
- 测试:你的杀毒软件到底多能干
- vnc—server配置
- 解决windows2003 sp1下使用sql2000的端口问题
- 通用ShellCode深入剖析
- 隐藏于“文本文档”中的阴谋