贪心算法马的遍历时间复杂度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贪心算法马的遍历时间复杂度相关的知识,希望对你有一定的参考价值。

贪心算法马的遍历8*8棋盘时间复杂度怎么算啊?请教高手!

参考技术A 【问题描述】 马的遍历问题。在8×8方格的棋盘上,从任意指定方格出发,为马寻找一条走遍棋盘每一格并且只经过一次的一条路径。 【初步设计】 首先这是一个搜索问题,运用深度优先搜索进行求解。算法如下: 1、输入初始位置坐标x,y; 2、步骤c: 如果c>64输出一个解,返回上一步骤c-- (x,y)←c 计算(x,y)的八个方位的子结点,选出那此可行的子结点 循环遍历所有可行子结点,步骤c++重复2 显然(2)是一个递归调用的过程,大致如下: voiddfs(intx,inty,intcount) inti,tx,ty; if(count>N*N) output_solution();//输入一个解 return; for(I=0;i<8;++i) tx=hn[i].x;//hn[]保存八个方位子结点 ty=hn[i].y; s[tx][ty]=count; dfs(tx,ty,count+1);//递归调用 s[tx][ty]=0; 这样做是完全可行的,它输入的是全部解,但是马遍历当8×8时解是非常之多的,用天文数字形容也不为过,这样一来求解的过程就非常慢,并且出一个解也非常慢。 怎么才能快速地得到部分解呢? 【贪心算法】 其实马踏棋盘的问题很早就有人提出,且早在1823年,J.C.Warnsdorff就提出了一个有名的算法。在每个结点对其子结点进行选取时,优先选择‘出口’最小的进行搜索,‘出口’的意思是在这些子结点中它们的可行子结点的个数,也就是‘孙子’结点越少的越优先跳,为什么要这样选取,这是一种局部调整最优的做法,如果优先选择出口多的子结点,那出口少的子结点就会越来越多,很可能出现‘死’结点(顾名思义就是没有出口又没有跳过的结点),这样对下面的搜索纯粹是徒劳,这样会浪费很多无用的时间,反过来如果每次都优先选择出口少的结点跳,那出口少的结点就会越来越少,这样跳成功的机会就更大一些。这种算法称为为贪心算法,也叫贪婪算法或启发示算法,它对整个求解过程的局部做最优调整,它只适用于求较优解或者部分解,而不能求最优解。这样的调整方法叫贪心策略,至于什么问题需要什么样的贪心策略是不确定的,具体问题具体分析。实验可以证明马遍历问题在运用到了上面的贪心策略之后求解速率有非常明显的提高,如果只要求出一个解甚至不用回溯就可以完成,因为在这个算法提出的时候世界上还没有计算机,这种方法完全可以用手工求出解来,其效率可想而知。 在前面的算法基础之上,增添一些程序加以实现: 函数1:计算结点出口多少 intways_out(intx,inty) inti,count=0,tx,ty; if(x<0||y<0||x>=N||y>=N||s[x][y]>0) return-1;//-1表示该结点非法或者已经跳过了 for(i=0;i<8;++i) tx=x+dx[i]; ty=y+dy[i]; if(tx<0||ty<0||tx>=N||ty>=N) continue; if(s[tx][ty]==0) ++count; returncount; 函数2:按结点出口进行排序 voidsortnode(h_node*hn,intn)//采用简单排序法,因为子结点数最多只有8 inti,j,t; h_nodetemp; for(i=0;i<n;++i) for(t=i,j=i+1;j<n;++j) if(hn[j].waysout<hn[t].waysout) t=j; if(t>i) temp=hn[i]; hn[i]=hn[t]; hn[t]=temp; 函数3:修改后的搜索函数 voiddfs(intx,inty,intcount) inti,tx,ty; h_nodehn[8]; if(count>N*N) output_solution(); return; for(i=0;i<8;++i)//求子结点和出口 hn[i].x=tx=x+dx[i]; hn[i].y=ty=y+dy[i]; hn[i].waysout=ways_out(tx,ty); sortnode(hn,8); for(i=0;hn[i].waysout<0;++i);//不考虑无用结点 for(;i<8;++i) tx=hn[i].x; ty=hn[i].y; s[tx][ty]=count; dfs(tx,ty,count+1); s[tx][ty]=0; 函数4:主调函数 voidmain() inti,j,x,y; for(i=0;i<N;++i)//初始化 for(j=0;j<N;++j) s[i][j]=0; printf("HorsejumpwhileN=%d\nInputthepositiontostart:",N); scanf("%d%d",&x,&y);//输入初始位置 while(x<0||y<0||x>=N||y>=N) printf("Error!x,yshouldbein0~%d",N-1); scanf("%d%d",&x,&y); s[x][y]=1; dfs(x,y,2);//开始搜索 QQ:547758555 有问题的话QQ上说本回答被提问者采纳

算法马踏棋盘算法 骑士走周游算法

文章目录


1.概述

马踏棋盘算法和八皇后问题很相似:【算法】八皇后问题


骑士周游问题的解决步骤和思路

  1. 创建棋盘chessBoard,是一个二维数组
  2. 将当前位置设置为已经访问,然后根据当前位置,计算马儿还能走哪些位置,并放入到一个集合中(ArrayList),最多有8个位置,每走一步, 就使用step+1
  3. 遍历ArrayList中存放的所有位置,看看哪个可以走通,如果走通,就继续,

以上是关于贪心算法马的遍历时间复杂度的主要内容,如果未能解决你的问题,请参考以下文章

01-简述

数据结构与算法

经典贪心算法:跳跃游戏

P3805 模板manacher 算法马拉车

(网课资源分享)数据结构与算法马士兵教育

清华大学机试 需要二刷 *贪心算法,比较虎人