主题:大侠帮我分析一下 时间复杂度
迷宫的递归算法代码:
#include<stdafx.h>
#include<windows.h>
#include<stdio.h>
struct PosType /* 迷宫坐标位置类型*/
{
int x; /* 行值*/
int y; /* 列值*/
};
#define MAXLENGTH 25 /* 设迷宫的最大行列为25 */
typedef int MazeType[MAXLENGTH][MAXLENGTH]; /* [行][列] */
/* 全局变量*/
struct PosType end; /* 迷宫终点位置*/
MazeType m= /* 迷宫数组*/
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
{ 0,-1, 0, 0, 0, 0, 0, 0, 0, 0,},
{ 0,-1, 0, 0, 0, 0,-1,-1, 0, 0,},
{ 0,-1,-1,-1, 0, 0,-1, 0, 0, 0,},
{ 0, 0,-1, 0, 0,-1,-1, 0, 0, 0,},
{ 0, 0,-1,-1, 0,-1, 0, 0, 0, 0,},
{ 0, 0, 0,-1, 0,-1, 0, 0, 0, 0,},
{ 0, 0, 0,-1,-1,-1,-1,-1,-1, 0,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
int x,y; /* 迷宫行数,列数*/
/* 定义墙元素值为0,可通过路径为-1,通过路径为足迹*/
void Print(int x,int y) /* 输出解*/
{ int i,j;
for(i=0; i<x; i++)
{
for(j=0;j<y;j++)
printf("%3d",m[i][j]);
printf("\n");
}
printf("\n");
}
void Try(struct PosType cur,int curstep)
{ /* 由当前位置cur、当前步骤curstep 试探下一点*/
int i;
struct PosType next; /* 下一个位置*/
struct PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; /* {行增量,列增量} */
for(i=0;i<=3;i++) /* 依次试探东南西北四个方向*/
{ next.x=cur.x+direc[i].x;
next.y=cur.y+direc[i].y;
if(m[next.x][next.y]==-1) /* 是通路*/
{ m[next.x][next.y]=2;
++curstep;
if(next.x!=end.x||next.y!=end.y)
{/* 没到终点*/
Try(next,curstep); /* 试探下一点(递归调用) */
}
else{
printf("输出结果:\n");
Print(x,y); /* 输出结果*/
}
m[next.x][next.y]=-1; /* 恢复为通路,试探下一条路*/
curstep--;
}
}
}
void main()
{ DWORD starttime,endtime;
struct PosType begin;
int i,j,x1,y1;
/*printf("请输入迷宫的行数,列数(包括外墙):");
scanf("%d,%d",&x,&y);
for(i=0;i<x;i++) /* 定义周边值为0(同墙) */
/*{
m[0][i]=0; /* 行周边*/
/* m[x-1][i]=0;
}
for(j=1;j<y-1;j++)
{
m[j][0]=0; /* 列周边*/
/* m[j][y-1]=0;
}
for(i=1;i<x-1;i++)
for(j=1;j<y-1;j++)
m[i][j]=-1; /* 定义通道初值为-1 */
/*
printf("请输入迷宫内墙单元数:");
scanf("%d",&j);
if(j)
printf("请依次输入迷宫内墙每个单元的行数,列数:\n");
for(i=1;i<=j;i++)
{
scanf("%d,%d",&x1,&y1);
m[x1][y1]=0;
}*/
starttime=GetTickCount();
printf("迷宫结构如下:\n");
x=10;y=10;
Print(x,y);
begin.x=1;
begin.y=1;
end.x=8;
end.y=8;
m[begin.x][begin.y]=1;
Try(begin,1); /* 由第一步起点试探起*/
endtime=GetTickCount();
printf("时间:%ld ms\n",endtime-starttime);
}
#include<stdafx.h>
#include<windows.h>
#include<stdio.h>
struct PosType /* 迷宫坐标位置类型*/
{
int x; /* 行值*/
int y; /* 列值*/
};
#define MAXLENGTH 25 /* 设迷宫的最大行列为25 */
typedef int MazeType[MAXLENGTH][MAXLENGTH]; /* [行][列] */
/* 全局变量*/
struct PosType end; /* 迷宫终点位置*/
MazeType m= /* 迷宫数组*/
{ { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,},
{ 0,-1, 0, 0, 0, 0, 0, 0, 0, 0,},
{ 0,-1, 0, 0, 0, 0,-1,-1, 0, 0,},
{ 0,-1,-1,-1, 0, 0,-1, 0, 0, 0,},
{ 0, 0,-1, 0, 0,-1,-1, 0, 0, 0,},
{ 0, 0,-1,-1, 0,-1, 0, 0, 0, 0,},
{ 0, 0, 0,-1, 0,-1, 0, 0, 0, 0,},
{ 0, 0, 0,-1,-1,-1,-1,-1,-1, 0,},
{ 0, 0, 0, 0, 0, 0, 0, 0,-1, 0,},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
int x,y; /* 迷宫行数,列数*/
/* 定义墙元素值为0,可通过路径为-1,通过路径为足迹*/
void Print(int x,int y) /* 输出解*/
{ int i,j;
for(i=0; i<x; i++)
{
for(j=0;j<y;j++)
printf("%3d",m[i][j]);
printf("\n");
}
printf("\n");
}
void Try(struct PosType cur,int curstep)
{ /* 由当前位置cur、当前步骤curstep 试探下一点*/
int i;
struct PosType next; /* 下一个位置*/
struct PosType direc[4]={{0,1},{1,0},{0,-1},{-1,0}}; /* {行增量,列增量} */
for(i=0;i<=3;i++) /* 依次试探东南西北四个方向*/
{ next.x=cur.x+direc[i].x;
next.y=cur.y+direc[i].y;
if(m[next.x][next.y]==-1) /* 是通路*/
{ m[next.x][next.y]=2;
++curstep;
if(next.x!=end.x||next.y!=end.y)
{/* 没到终点*/
Try(next,curstep); /* 试探下一点(递归调用) */
}
else{
printf("输出结果:\n");
Print(x,y); /* 输出结果*/
}
m[next.x][next.y]=-1; /* 恢复为通路,试探下一条路*/
curstep--;
}
}
}
void main()
{ DWORD starttime,endtime;
struct PosType begin;
int i,j,x1,y1;
/*printf("请输入迷宫的行数,列数(包括外墙):");
scanf("%d,%d",&x,&y);
for(i=0;i<x;i++) /* 定义周边值为0(同墙) */
/*{
m[0][i]=0; /* 行周边*/
/* m[x-1][i]=0;
}
for(j=1;j<y-1;j++)
{
m[j][0]=0; /* 列周边*/
/* m[j][y-1]=0;
}
for(i=1;i<x-1;i++)
for(j=1;j<y-1;j++)
m[i][j]=-1; /* 定义通道初值为-1 */
/*
printf("请输入迷宫内墙单元数:");
scanf("%d",&j);
if(j)
printf("请依次输入迷宫内墙每个单元的行数,列数:\n");
for(i=1;i<=j;i++)
{
scanf("%d,%d",&x1,&y1);
m[x1][y1]=0;
}*/
starttime=GetTickCount();
printf("迷宫结构如下:\n");
x=10;y=10;
Print(x,y);
begin.x=1;
begin.y=1;
end.x=8;
end.y=8;
m[begin.x][begin.y]=1;
Try(begin,1); /* 由第一步起点试探起*/
endtime=GetTickCount();
printf("时间:%ld ms\n",endtime-starttime);
}