`
- 浏览:
1149947 次
- 性别:
- 来自:
北京
-
解法1:
/**//*
使用回溯法计算迷宫问题
*/
#include<stdio.h>
#include<stdlib.h>
structpos...{
introw;
intcol;
};
voidmain()...{
intmaze[5][5]=...{
0,1,0,1,0,
0,0,0,1,0,
0,1,0,1,0,
0,1,0,0,0,
0,0,1,1,0
};//1表示障碍,0表示可以通过
intdir=1;//标记方向:上1左2下3右4
inti=0;
intj=0;
structpos*stack=(structpos*)calloc(25,sizeof(structpos));
inttop=0;
while(true)...{
if(i==4&&j==4)...{//已经找到终点,打印结果
printf("Finish! Thepathis: ");
for(dir=0;dir<top;dir++)...{
printf("(");
printf("%d",stack[dir].row);
printf(",");
printf("%d",stack[dir].col);
printf(")");
}
printf("(4,4)");
break;
}
if(dir==1)...{
if(i>0&&*(*(maze+i-1)+j)==0//下一个位置不越界而且可以通过
&&!(stack[top-1].row==i-1&&stack[top-1].col==j))...{
//还需满足:这个将要走的位置不属于刚才走来的路!
stack[top].row=i;
stack[top].col=j;
top++;//进栈
i--;
dir=1;//重置方向标识
}else...{
dir++;
}
}
elseif(dir==2)...{
if(j>0&&*(*(maze+i)+j-1)==0
&&!(stack[top-1].row==i&&stack[top-1].col==j-1))...{
stack[top].row=i;
stack[top].col=j;
top++;
j--;
dir=1;
}else...{
dir++;
}
}
elseif(dir==3)...{
if(i<4&&*(*(maze+i+1)+j)==0
&&!(stack[top-1].row==i+1&&stack[top-1].col==j))...{
stack[top].row=i;
stack[top].col=j;
top++;
i++;
dir=2;
}else...{
dir++;
}
}
else...{
if(j<4&&*(*(maze+i)+j+1)==0
&&!(stack[top-1].row==i&&stack[top-1].col==j+1))...{
stack[top].row=i;
stack[top].col=j;
top++;
j++;
dir=1;
}else...{//已经没有别的路了,只有回头
*(*(maze+i)+j)=1;//在回头前标识当前路为不能通过
i=stack[top-1].row;
j=stack[top-1].col;
top--;//出栈
dir=1;//重置方向标识符
}
}
}
}
解法2:
/**//*
使用回溯法计算迷宫问题
*/
#include<stdio.h>
#include<stdlib.h>
structpos...{
introw;
intcol;
intdirection[5];//标记方向direction[1~4]上左下右
};
voidmain()...{
intmaze[5][5]=...{
0,1,0,1,0,
0,0,0,1,0,
0,1,0,1,0,
0,1,0,0,0,
0,0,1,1,0
};//1表示障碍,0表示可以通过
intdirection[5]=...{0};
intdir=1;//作为direction数组的下标
inti=0;
intj=0;
intcount=0;
structpos*stack=(structpos*)calloc(25,sizeof(structpos));//栈,存放路径
inttop=0;
//将栈内元素全部初始化
for(count=0;count<25;count++)...{
stack[count].col=0;
stack[count].row=0;
for(intt=0;t<=4;t++)
stack[count].direction[t]=0;
}
while(true)...{
if(i==1&&j==2)...{
intt=1;
};
if(i==4&&j==4)...{//已经找到终点,打印结果
printf("Finish! Thepathis: ");
for(count=0;count<top;count++)...{
printf("(");
printf("%d",stack[count].row);
printf(",");
printf("%d",stack[count].col);
printf(")");
}
printf("(4,4)");
break;
}
if(direction[1]==0
&&i>0
&&*(*(maze+i-1)+j)==0)...{//上方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col=j;
direction[1]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]=direction[count];
direction[count]=0;//使下一个位置方向状态初始化
}
direction[3]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
direction[3]=1;
i--;
}
elseif(direction[2]==0
&&j>0
&&*(*(maze+i)+j-1)==0)...{//左方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col=j;
direction[2]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]=direction[count];
direction[count]=0;//使下一个位置方向状态初始化
}
direction[4]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
j--;
}
elseif(direction[3]==0
&&i<4
&&*(*(maze+i+1)+j)==0)...{//下方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col=j;
direction[3]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]=direction[count];
direction[count]=0;//使下一个位置方向状态初始化
}
direction[1]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
i++;
}
elseif(direction[4]==0
&&j<4
&&*(*(maze+i)+j+1)==0)...{//右方向的下一个位置不越界而且可以通过
stack[top].row=i;
stack[top].col=j;
direction[4]=1;
for(count=1;count<=4;count++)...{
stack[top].direction[count]=direction[count];
direction[count]=0;//使下一个位置方向状态初始化
}
direction[2]=1;//更新下一个位置:使朝向原位置的方向标识置1
top++;//进栈
j++;
}else...{//已经没有别的路了,只有回头
if(top==0)...{
printf("Nopath!");
break;
}
*(*(maze+i)+j)=1;//在回头前标识当前路为不能通过
top--;//出栈
i=stack[top].row;
j=stack[top].col;
for(count=1;count<=4;count++)
direction[count]=stack[top].direction[count];
}
//printf("(%d,%d)",i,j);
}//while
}
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
回溯法解迷宫问题.
这是大一下学期算法的期末作业,用C语言做了一个解迷宫问题的小动画,文件内附源码、开发文档、演示ppt和可执行文件,一看就会,而且充满趣味性,各位看官可以自己看一下,五分绝对物超所值
该程序框图是迷宫问题求解的形象描述,通过该框图可以很好的了解上一篇源代码的内容
用回溯法完成迷宫问题,思路比较简单,有详细的注释
利用回溯法解迷宫问题,程序演示了如何走出一个42*42的迷宫。
该算法可以随机产生任意大小的迷宫,迷宫的大小由用户输入决定 回溯法解决迷宫是个经典算法,利用顺序栈来存储迷宫路线 如果能成功走出迷宫,可以画出迷宫轨迹
表面上似乎迷宫问题是一种特殊问题的解决方法,其实迷宫问题是一种特殊形式图的问题,因此,迷宫总量可转化为图的问题来解决。设计一个计算机程序对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论...
迷宫问题的求解是实验心理学中的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫,迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口放了一块奶酪,吸引老鼠在迷宫中...
本程序 使用回溯法求解迷宫。 c# 语言wpf 开发,VS2010
回溯法解数独问题,能够准确给出数独的解.
数据结构走迷宫算法,学习了他人的之后自己写的程序,运行OK
VC++2012编程演练数据结构《8》回溯法解决迷宫问题
对于给定迷宫(n*n),和一个起始坐标和终点坐标,设计一个回溯算法,编程判断起点能否到达终点,若能打印出路径。 输入数据: 有文件input。txt给出数据。第一行有1个正整数n(表示迷宫大小),第二行为路径;‘x’...
回溯算法解迷宫问题(C语言).doc
C语言重解经典回溯算法案例-迷宫问题 --- Word版本...
基于C++使用回溯法求解数织问题.zip 基于C++使用回溯法求解数织问题.zip 基于C++使用回溯法求解数织问题.zip 基于C++使用回溯法求解数织问题.zip 基于C++使用回溯法求解数织问题.zip 基于C++使用回溯法求解数织问题....
该程序由C++实现,主要分为三个函数,分别是init函数、track函数、show_result函数。代码很容易懂的!
c语言回溯法走迷宫的源码c语言回溯法走迷宫的源码
用回溯法解决0-1背包问题 用回溯法解决0-1背包问题,一看就明白,超经典解法。