本帖最后由 loms126 于 2013-3-22 14:42 编辑
先拿MATLAB写了一个,程序见附件:
使用最原始的递归,没有进行优化。
递归函数- function [OK_flag]=check_route(Matrix,now_x,now_y,remain_block_count)
- global N route_x route_y
- % figure(1) %调试时用的,百分号为matlab注释标记
- % cla
- % plot(now_x,now_y,'.', 'MarkerSize',80)
- % axis([1,N,-N,-1])
- OK_flag=false; %C语言 放到最后,之前没有返回成功(true)时,返回该值
- if remain_block_count==0 %判断是否全部走完
- route_x=[route_x,now_x]; %将路径 倒序放回到route全局变量里
- route_y=[route_y,now_y];
- OK_flag=true; %返回成功
- return
- end
- %go up %向上走,以下四个判断大同小异,对应不同方向
- if (now_y>1) && ((Matrix(now_x,now_y-1))==1) %不是最上边缘才能向上走,且上面的一格没走过
- next_x=now_x; %下一步的坐标
- next_y=now_y-1;
- temp_Matrix=Matrix; temp_Matrix(now_x,now_y)=0; %缓存一下矩阵(下面还要用到,c里面注意直接赋值传递的是指针,需修改),当前点走过做标记
- [OK_flag]=check_route(temp_Matrix,next_x,next_y,remain_block_count-1); %递归
- if OK_flag %判断是否全部走完,如果是,倒序添加路径,逐层向上返回
- route_x=[route_x,now_x]; %matlab支持矩阵拼接,C中需要根据remain_block_count的值,按数组序号赋值
- route_y=[route_y,now_y];
- return
- end
- end
- %go down
- if (now_y<N) && ((Matrix(now_x,now_y+1))==1)
- next_x=now_x;
- next_y=now_y+1;
- temp_Matrix=Matrix; temp_Matrix(now_x,now_y)=0;
- [OK_flag]=check_route(temp_Matrix,next_x,next_y,remain_block_count-1);
- if OK_flag
- route_x=[route_x,now_x];
- route_y=[route_y,now_y];
- return
- end
- end
- %left
- if (now_x>1) && ((Matrix(now_x-1,now_y))==1)
- next_x=now_x-1;
- next_y=now_y;
- temp_Matrix=Matrix; temp_Matrix(now_x,now_y)=0;
- [OK_flag]=check_route(temp_Matrix,next_x,next_y,remain_block_count-1);
- if OK_flag
- route_x=[route_x,now_x];
- route_y=[route_y,now_y];
- return
- end
- end
- %right
- if (now_x<N) && ((Matrix(now_x+1,now_y))==1)
- next_x=now_x+1;
- next_y=now_y;
- temp_Matrix=Matrix; temp_Matrix(now_x,now_y)=0;
- [OK_flag]=check_route(temp_Matrix,next_x,next_y,remain_block_count-1);
- if OK_flag
- route_x=[route_x,now_x];
- route_y=[route_y,now_y];
- return
- end
- end
- return
复制代码
主函数- global N
- global route_x route_y
- N=6;
- Matrix=ones(N,N); %生成 N*N,元素全是1的二维矩阵
- start_x=1; %起始点 x y
- start_y=1;
- route_x=[]; %清空路径
- route_y=[];
- [OK_flag]=check_route(Matrix,start_x,start_y,N*N-1)
- route_x %输出路径
- route_y
复制代码 先吃饭去了,注释一会补充。2:41PM补充注释。
|