一个带拐点搜索的迷宫算法
来源:互联网 发布:淘宝买家提高好评率 编辑:程序博客网 时间:2024/04/28 00:31
#include "stdio.h"
#define maxi 15
#define maxj 15
/*一个普通的迷宫*/
int I_maze[maxi][maxj]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,
0,1,0,0,0,1,1,0,0,0,0,1,0,1,0,
0,1,0,0,0,0,1,1,1,0,0,1,0,1,0,
0,0,0,1,1,1,1,0,0,1,1,1,0,1,0,
0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,
0,1,1,1,1,1,0,0,0,0,0,1,0,1,0,
0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,
0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,
0,0,0,1,1,1,1,0,0,1,1,1,0,1,0,
0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,
0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,
0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0};
int I_record[maxi][maxj]; /*一个辅助空间,用于记录走过的点*/
int n=0; /*记录能找到出口的能有几条路*/
int lasti[3] = {0,0,0};
int lastj[3] = {0,0,0};
typedef struct Point
{
int x;
int y;
} CPoint;
int Index = 0;
CPoint I_Posrecord[maxi * maxj];
//读取迷宫路径
void findPath(int x, int y)
{
if (x==14 && y==11)
{
I_Posrecord[Index].x = x;
I_Posrecord[Index].y = y;
Index ++;
}
for(int i = 0; i < Index; i++)
{
//该点被访问过;
if(x == I_Posrecord[i].x && y == I_Posrecord[i].y)
return;
}
if(I_record[x][y] == 1)
{
I_Posrecord[Index].x = x;
I_Posrecord[Index].y = y;
Index ++;
findPath(x, y+1);
findPath(x-1, y);
findPath(x+1, y);
findPath(x, y-1);
}
}
//在路径中搜索拐点
int findInflexion(int x, int y)
{
for(int i = 0; i < maxi * maxj; i++)
{
I_Posrecord[i].x = 0;
I_Posrecord[i].y = 0;
}
findPath(x,y);
int iInflexion = 0;
if(Index < 3)
return iInflexion;
for(i = 0; i < Index-2; i++)
{
if(I_Posrecord[i].x != I_Posrecord[i+2].x && I_Posrecord[i].y != I_Posrecord[i+2].y)
{
iInflexion++;
//printf("%d %d/n",I_Posrecord[i+1].x,I_Posrecord[i+1].y);
}
}
Index = 0;
return iInflexion;
}
void Suanfa(int i,int j) /*求解函数*/
{
static int i1,j1;
if (I_maze[i][j]!=0 && I_record[i][j]!=1)
{
I_record[i][j]=1;
if (i==14 && j==11) /*如果找到出口就记录(14,11为出口),并输出*/
{
n++;
for (i1=0;i1 <maxi;i1++)
{
for (j1=0;j1 <maxj;j1++)
{
printf("%d,",I_record[i1][j1]);
}
printf("/n");
}
printf("/n");
int iInflexion = findInflexion(1,0);
printf("拐点数为:%d",iInflexion); //输出拐点数
printf("/n");
}
//find inflexion
//int nCount = findInflexion(i,j);
Suanfa(i,j+1);
//I_record[i][j]=0;
//I_record[i][j]=1;
Suanfa(i+1,j);
//I_record[i][j]=0;
//I_record[i][j]=1;
Suanfa(i-1,j);
//I_record[i][j]=0;
//I_record[i][j]=1;
Suanfa(i,j-1);
I_record[i][j]=0; //回溯
}
}
int main()
{
int i,j;
for (i=0;i <maxi;i++)
for (j=0;j <maxj;j++)
I_record[i][j]=0;
Suanfa(1,0); /*输入起点*/
printf("%d",n);
return 0;
}
基于效率的考虑,我对算法进行了优化:
#include "stdio.h"
#define maxi 15
#define maxj 15
/*一个普通的迷宫*/
int I_maze[maxi][maxj]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,1,1,1,1,1,0,0,0,0,0,1,1,1,0,
0,1,0,0,0,1,1,0,0,0,0,1,0,1,0,
0,1,0,0,0,0,1,1,1,0,0,1,0,1,0,
0,0,0,1,1,1,1,0,0,1,1,1,0,1,0,
0,0,0,1,0,0,0,0,0,0,0,1,0,1,0,
0,1,1,1,1,1,0,0,0,0,0,1,0,1,0,
0,0,0,0,0,1,1,1,1,1,1,1,0,1,0,
0,0,0,0,0,0,1,0,0,0,0,1,0,1,0,
0,0,0,1,1,1,1,0,0,1,1,1,0,1,0,
0,0,0,0,0,1,0,0,0,0,0,0,0,1,0,
0,1,1,1,1,1,0,0,1,1,1,1,1,1,0,
0,1,0,0,0,1,1,0,0,0,0,1,0,0,0,
0,1,0,0,0,0,1,1,1,1,1,1,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,1,0,0,0};
int I_record[maxi][maxj]; /*一个辅助空间,用于记录走过的点*/
int n=0; /*记录能找到出口的能有几条路*/
typedef struct Point
{
int x;
int y;
} CPoint;
int Index = 0;
CPoint I_Posrecord[maxi * maxj];
//在路径中搜索拐点
int findInflexion(int x, int y, int Mode)
{
I_Posrecord[Index].x = x;
I_Posrecord[Index].y = y;
Index +=Mode;
if(Mode == -1)
return 0;
int iInflexion = 0;
if(Index < 3)
return iInflexion;
for(int i = 0; i < Index-2; i++)
{
if(I_Posrecord[i].x != I_Posrecord[i+2].x && I_Posrecord[i].y != I_Posrecord[i+2].y)
{
iInflexion++;
//printf("%d %d/n",I_Posrecord[i+1].x,I_Posrecord[i+1].y);
}
}
return iInflexion;
}
void Suanfa(int i,int j) /*求解函数*/
{
static int i1,j1;
if (I_maze[i][j]!=0 && I_record[i][j]!=1)
{
I_record[i][j]=1;
int iInflexion = findInflexion(i,j,1);
if(iInflexion > 13) // 如果大于设定的拐点数,停止搜索
{
I_record[i][j]=0;
findInflexion(0,0,-1);//返回上一个点
return;
}
if (i==14 && j==11) /*如果找到出口就记录(14,11为出口),并输出*/
{
n++;
for (i1=0;i1 <maxi;i1++)
{
for (j1=0;j1 <maxj;j1++)
{
printf("%d,",I_record[i1][j1]);
}
printf("/n");
}
printf("/n");
//int iInflexion = findInflexion(1,0);
printf("拐点数为:%d",iInflexion); //输出拐点数
printf("/n");
}
Suanfa(i,j+1);
//I_record[i][j]=0;
//I_record[i][j]=1;
Suanfa(i+1,j);
//I_record[i][j]=0;
//I_record[i][j]=1;
Suanfa(i-1,j);
//I_record[i][j]=0;
//I_record[i][j]=1;
Suanfa(i,j-1);
I_record[i][j]=0; //回溯
findInflexion(0,0,-1);//返回上一个点
}
}
int main()
{
int i,j;
for (i=0;i <maxi;i++)
for (j=0;j <maxj;j++)
I_record[i][j]=0;
Suanfa(1,0); /*输入起点*/
printf("%d",n);
return 0;
}
- 一个带拐点搜索的迷宫算法
- 一个生成迷宫的算法
- 一个简单的迷宫算法
- 一个搜索迷宫出路的程序
- 一个JAVA编写的迷宫算法。。自动找迷宫出口
- 搜索算法之迷宫问题
- 一个迷宫生成算法
- 基于栈结构的迷宫搜索算法,数据结构
- 广度优先搜索迷宫路径算法的实现
- 深度优先搜索迷宫路径算法的实现
- 基于bfs搜索算法的迷宫最短路径游戏
- 移动搜索到拐点了?
- 电子老鼠走迷宫-搜索算法
- 冬季的拐点
- NOI 2.5基本算法之搜索 走出迷宫----广搜算法的实现
- 关于迷宫的算法
- 栈的迷宫算法
- 有关路径搜索的一个算法
- 审核Auditing
- Struts上传
- wxWidgets notepad
- struts2拦截器(Interceptor)与传统拦截器(Filter)
- 深入C++的new
- 一个带拐点搜索的迷宫算法
- 发生ORA-14097的一个原因
- 今天我的阴历生日,我不开心
- 公司治理需本土化一一评《公司治理:董事与经理手册》
- 《请不要做浮躁的人》
- GIS .net 二次开发
- 第二十三課おいしい生活
- 计算机接口
- ISAPI筛选器及对ASP源文件的保护