文章目录

  • 一、问题描述
  • 二、问题分析
  • 三、深度优先搜索(Depth First Search)
    • 1.基本原理
    • 2.代码预览
  • 四、dfs+贪心算法
    • 1.贪心策略
    • 2.贪心原理
    • 3.核心代码
    • 4.代码预览
  • 五、栈+贪心
    • 1.回溯方法
    • 2.基本操作
    • 3.核心代码
    • 4.代码预览
  • 总结

一、问题描述

国际象棋的棋盘为8×8的方格棋盘。现将“马”放在任意指定的方格中,按照“马”走日的规则将“马”进行移动。要求每个方格只能进入一次,最终使得“马”走遍棋盘的64个方格。

给定起始位置,由该点位起点,输出能走遍棋盘的每一步的足迹


二、问题分析

首先要了解马的移动规则,在正常情况下,马是有八个可供选择的移动方向的。

用二维数组来表示棋盘,棋盘的行就是x,列就是y

在这里,马的坐标是(3,3),而马能走的八个坐标如下:

( 3+1 , 3+2 ) , ( 3-1 , 3+2 ) , ( 3+1 , 3-2 ) , ( 3-1 , 3-2 )
( 3+2 , 3+1 ) , ( 3-2 , 3+1 ) , ( 3+2 , 3-1 ) , ( 3-2 , 3-1 )

我们可以得出马移动时的偏移量,记为dir数组

 int dir[8][2] = { {1,2},{-1,2},{1,-2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1} };

这样我们就可以表示出任意一点(x,y)可移动的位置

 int x = 3, y = 3;for (int i = 0; i < 8; i++){int tx = x + dir[i][0];int ty = y + dir[i][1];printf("( %d , %d )\n", tx, ty);}

但这样给出的坐标还并不一定是对的,可能有些坐标是已经走过的,也可能有些坐标出界了(跑到棋盘外面去了),所以我们需要作出判断

 //这里的棋盘是8 * 8 的//给棋盘开 10 * 10 的空间是为了防止意外溢出int map[10][10];  //棋盘int vis[10][10];    //用来表示该点是否访问过,为1表示访问过,0反之bool in(int x , int y)   //判断(x,y)是否在棋盘内{return x >= 0 && x < 8 && y >= 0 && y < 8;}
 for(int i = 0 ; i < 8 ; i++){int tx = x + dir[i][0];int ty = y + dir[i][1];if(in(tx,ty) && !vis[tx][ty]){//这里表示的是:如果(tx,ty)在棋盘内且没走过,就输出该坐标printf("( %d , %d )\n", tx, ty);}}

之后,我们就可以进行搜索操作了

三、深度优先搜索(Depth First Search)

1.基本原理

我们可以先采取深度优先搜索(dfs),靠穷举法找出答案 深度优先搜索类似于一条路走到黑,走错了再退回来的感觉 比如:

#mermaid-svg-X0IrXi2VNqWzHuo1 .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .label text{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .node rect,#mermaid-svg-X0IrXi2VNqWzHuo1 .node circle,#mermaid-svg-X0IrXi2VNqWzHuo1 .node ellipse,#mermaid-svg-X0IrXi2VNqWzHuo1 .node polygon,#mermaid-svg-X0IrXi2VNqWzHuo1 .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-X0IrXi2VNqWzHuo1 .node .label{text-align:center;fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .node.clickable{cursor:pointer}#mermaid-svg-X0IrXi2VNqWzHuo1 .arrowheadPath{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-X0IrXi2VNqWzHuo1 .flowchart-link{stroke:#333;fill:none}#mermaid-svg-X0IrXi2VNqWzHuo1 .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-X0IrXi2VNqWzHuo1 .edgeLabel rect{opacity:0.9}#mermaid-svg-X0IrXi2VNqWzHuo1 .edgeLabel span{color:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-X0IrXi2VNqWzHuo1 .cluster text{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-X0IrXi2VNqWzHuo1 .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-X0IrXi2VNqWzHuo1 text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-X0IrXi2VNqWzHuo1 .actor-line{stroke:grey}#mermaid-svg-X0IrXi2VNqWzHuo1 .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .sequenceNumber{fill:#fff}#mermaid-svg-X0IrXi2VNqWzHuo1 #sequencenumber{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 #crosshead path{fill:#333;stroke:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .messageText{fill:#333;stroke:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-X0IrXi2VNqWzHuo1 .labelText,#mermaid-svg-X0IrXi2VNqWzHuo1 .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-X0IrXi2VNqWzHuo1 .loopText,#mermaid-svg-X0IrXi2VNqWzHuo1 .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-X0IrXi2VNqWzHuo1 .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-X0IrXi2VNqWzHuo1 .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-X0IrXi2VNqWzHuo1 .noteText,#mermaid-svg-X0IrXi2VNqWzHuo1 .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-X0IrXi2VNqWzHuo1 .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-X0IrXi2VNqWzHuo1 .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-X0IrXi2VNqWzHuo1 .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-X0IrXi2VNqWzHuo1 .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .section{stroke:none;opacity:0.2}#mermaid-svg-X0IrXi2VNqWzHuo1 .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-X0IrXi2VNqWzHuo1 .section2{fill:#fff400}#mermaid-svg-X0IrXi2VNqWzHuo1 .section1,#mermaid-svg-X0IrXi2VNqWzHuo1 .section3{fill:#fff;opacity:0.2}#mermaid-svg-X0IrXi2VNqWzHuo1 .sectionTitle0{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .sectionTitle1{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .sectionTitle2{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .sectionTitle3{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-X0IrXi2VNqWzHuo1 .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .grid path{stroke-width:0}#mermaid-svg-X0IrXi2VNqWzHuo1 .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-X0IrXi2VNqWzHuo1 .task{stroke-width:2}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskText:not([font-size]){font-size:11px}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-X0IrXi2VNqWzHuo1 .task.clickable{cursor:pointer}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskText0,#mermaid-svg-X0IrXi2VNqWzHuo1 .taskText1,#mermaid-svg-X0IrXi2VNqWzHuo1 .taskText2,#mermaid-svg-X0IrXi2VNqWzHuo1 .taskText3{fill:#fff}#mermaid-svg-X0IrXi2VNqWzHuo1 .task0,#mermaid-svg-X0IrXi2VNqWzHuo1 .task1,#mermaid-svg-X0IrXi2VNqWzHuo1 .task2,#mermaid-svg-X0IrXi2VNqWzHuo1 .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutside0,#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutside2{fill:#000}#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutside1,#mermaid-svg-X0IrXi2VNqWzHuo1 .taskTextOutside3{fill:#000}#mermaid-svg-X0IrXi2VNqWzHuo1 .active0,#mermaid-svg-X0IrXi2VNqWzHuo1 .active1,#mermaid-svg-X0IrXi2VNqWzHuo1 .active2,#mermaid-svg-X0IrXi2VNqWzHuo1 .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-X0IrXi2VNqWzHuo1 .activeText0,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeText1,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeText2,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeText3{fill:#000 !important}#mermaid-svg-X0IrXi2VNqWzHuo1 .done0,#mermaid-svg-X0IrXi2VNqWzHuo1 .done1,#mermaid-svg-X0IrXi2VNqWzHuo1 .done2,#mermaid-svg-X0IrXi2VNqWzHuo1 .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-X0IrXi2VNqWzHuo1 .doneText0,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneText1,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneText2,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneText3{fill:#000 !important}#mermaid-svg-X0IrXi2VNqWzHuo1 .crit0,#mermaid-svg-X0IrXi2VNqWzHuo1 .crit1,#mermaid-svg-X0IrXi2VNqWzHuo1 .crit2,#mermaid-svg-X0IrXi2VNqWzHuo1 .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCrit0,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCrit1,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCrit2,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCrit0,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCrit1,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCrit2,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-X0IrXi2VNqWzHuo1 .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-X0IrXi2VNqWzHuo1 .milestoneText{font-style:italic}#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCritText0,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCritText1,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCritText2,#mermaid-svg-X0IrXi2VNqWzHuo1 .doneCritText3{fill:#000 !important}#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCritText0,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCritText1,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCritText2,#mermaid-svg-X0IrXi2VNqWzHuo1 .activeCritText3{fill:#000 !important}#mermaid-svg-X0IrXi2VNqWzHuo1 .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-X0IrXi2VNqWzHuo1 g.classGroup text .title{font-weight:bolder}#mermaid-svg-X0IrXi2VNqWzHuo1 g.clickable{cursor:pointer}#mermaid-svg-X0IrXi2VNqWzHuo1 g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-X0IrXi2VNqWzHuo1 g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-X0IrXi2VNqWzHuo1 .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-X0IrXi2VNqWzHuo1 .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-X0IrXi2VNqWzHuo1 .dashed-line{stroke-dasharray:3}#mermaid-svg-X0IrXi2VNqWzHuo1 #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 .commit-id,#mermaid-svg-X0IrXi2VNqWzHuo1 .commit-msg,#mermaid-svg-X0IrXi2VNqWzHuo1 .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-X0IrXi2VNqWzHuo1 g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-X0IrXi2VNqWzHuo1 g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-X0IrXi2VNqWzHuo1 g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-X0IrXi2VNqWzHuo1 .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-X0IrXi2VNqWzHuo1 .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-X0IrXi2VNqWzHuo1 .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-X0IrXi2VNqWzHuo1 .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-X0IrXi2VNqWzHuo1 .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-X0IrXi2VNqWzHuo1 .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-X0IrXi2VNqWzHuo1 .edgeLabel text{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-X0IrXi2VNqWzHuo1 .node circle.state-start{fill:black;stroke:black}#mermaid-svg-X0IrXi2VNqWzHuo1 .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-X0IrXi2VNqWzHuo1 #statediagram-barbEnd{fill:#9370db}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-state .divider{stroke:#9370db}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-X0IrXi2VNqWzHuo1 .note-edge{stroke-dasharray:5}#mermaid-svg-X0IrXi2VNqWzHuo1 .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-X0IrXi2VNqWzHuo1 .error-icon{fill:#522}#mermaid-svg-X0IrXi2VNqWzHuo1 .error-text{fill:#522;stroke:#522}#mermaid-svg-X0IrXi2VNqWzHuo1 .edge-thickness-normal{stroke-width:2px}#mermaid-svg-X0IrXi2VNqWzHuo1 .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-X0IrXi2VNqWzHuo1 .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-X0IrXi2VNqWzHuo1 .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-X0IrXi2VNqWzHuo1 .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-X0IrXi2VNqWzHuo1 .marker{fill:#333}#mermaid-svg-X0IrXi2VNqWzHuo1 .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-X0IrXi2VNqWzHuo1 {color: rgba(0, 0, 0, 0.75);font: ;}

a
b
c
d
e
f

若要从a走到f
就是a先到b,b再到d,因为无路可走了,就回退到b,但d走过了,所以走e,走到e后发现仍是无路可走,又回退到b,此时d和e都走过了,b也没有可以选择的路径了,只能回退,回退到a点后,由于b已经走过,只能走到c,c只能走到f。这样就通过深度优先搜索从a点找到了去f点的路径。

 //dfs基本框架void dfs(/*参数按需求*/){//截止条件,搜索到了就要截止了,退出函数//标记该点已访问//遍历候选节点且遍历时进行筛选,符合条件才可遍历//回溯//回溯就是让这个已经访问过的点改为没有访问过的状态}
#mermaid-svg-okkxIkTiN7kDQuXv .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-okkxIkTiN7kDQuXv .label text{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .node rect,#mermaid-svg-okkxIkTiN7kDQuXv .node circle,#mermaid-svg-okkxIkTiN7kDQuXv .node ellipse,#mermaid-svg-okkxIkTiN7kDQuXv .node polygon,#mermaid-svg-okkxIkTiN7kDQuXv .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-okkxIkTiN7kDQuXv .node .label{text-align:center;fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .node.clickable{cursor:pointer}#mermaid-svg-okkxIkTiN7kDQuXv .arrowheadPath{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-okkxIkTiN7kDQuXv .flowchart-link{stroke:#333;fill:none}#mermaid-svg-okkxIkTiN7kDQuXv .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-okkxIkTiN7kDQuXv .edgeLabel rect{opacity:0.9}#mermaid-svg-okkxIkTiN7kDQuXv .edgeLabel span{color:#333}#mermaid-svg-okkxIkTiN7kDQuXv .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-okkxIkTiN7kDQuXv .cluster text{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-okkxIkTiN7kDQuXv .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-okkxIkTiN7kDQuXv text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-okkxIkTiN7kDQuXv .actor-line{stroke:grey}#mermaid-svg-okkxIkTiN7kDQuXv .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-okkxIkTiN7kDQuXv .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-okkxIkTiN7kDQuXv #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-okkxIkTiN7kDQuXv .sequenceNumber{fill:#fff}#mermaid-svg-okkxIkTiN7kDQuXv #sequencenumber{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv #crosshead path{fill:#333;stroke:#333}#mermaid-svg-okkxIkTiN7kDQuXv .messageText{fill:#333;stroke:#333}#mermaid-svg-okkxIkTiN7kDQuXv .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-okkxIkTiN7kDQuXv .labelText,#mermaid-svg-okkxIkTiN7kDQuXv .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-okkxIkTiN7kDQuXv .loopText,#mermaid-svg-okkxIkTiN7kDQuXv .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-okkxIkTiN7kDQuXv .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-okkxIkTiN7kDQuXv .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-okkxIkTiN7kDQuXv .noteText,#mermaid-svg-okkxIkTiN7kDQuXv .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-okkxIkTiN7kDQuXv .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-okkxIkTiN7kDQuXv .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-okkxIkTiN7kDQuXv .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-okkxIkTiN7kDQuXv .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .section{stroke:none;opacity:0.2}#mermaid-svg-okkxIkTiN7kDQuXv .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-okkxIkTiN7kDQuXv .section2{fill:#fff400}#mermaid-svg-okkxIkTiN7kDQuXv .section1,#mermaid-svg-okkxIkTiN7kDQuXv .section3{fill:#fff;opacity:0.2}#mermaid-svg-okkxIkTiN7kDQuXv .sectionTitle0{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .sectionTitle1{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .sectionTitle2{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .sectionTitle3{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-okkxIkTiN7kDQuXv .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .grid path{stroke-width:0}#mermaid-svg-okkxIkTiN7kDQuXv .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-okkxIkTiN7kDQuXv .task{stroke-width:2}#mermaid-svg-okkxIkTiN7kDQuXv .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .taskText:not([font-size]){font-size:11px}#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-okkxIkTiN7kDQuXv .task.clickable{cursor:pointer}#mermaid-svg-okkxIkTiN7kDQuXv .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-okkxIkTiN7kDQuXv .taskText0,#mermaid-svg-okkxIkTiN7kDQuXv .taskText1,#mermaid-svg-okkxIkTiN7kDQuXv .taskText2,#mermaid-svg-okkxIkTiN7kDQuXv .taskText3{fill:#fff}#mermaid-svg-okkxIkTiN7kDQuXv .task0,#mermaid-svg-okkxIkTiN7kDQuXv .task1,#mermaid-svg-okkxIkTiN7kDQuXv .task2,#mermaid-svg-okkxIkTiN7kDQuXv .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutside0,#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutside2{fill:#000}#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutside1,#mermaid-svg-okkxIkTiN7kDQuXv .taskTextOutside3{fill:#000}#mermaid-svg-okkxIkTiN7kDQuXv .active0,#mermaid-svg-okkxIkTiN7kDQuXv .active1,#mermaid-svg-okkxIkTiN7kDQuXv .active2,#mermaid-svg-okkxIkTiN7kDQuXv .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-okkxIkTiN7kDQuXv .activeText0,#mermaid-svg-okkxIkTiN7kDQuXv .activeText1,#mermaid-svg-okkxIkTiN7kDQuXv .activeText2,#mermaid-svg-okkxIkTiN7kDQuXv .activeText3{fill:#000 !important}#mermaid-svg-okkxIkTiN7kDQuXv .done0,#mermaid-svg-okkxIkTiN7kDQuXv .done1,#mermaid-svg-okkxIkTiN7kDQuXv .done2,#mermaid-svg-okkxIkTiN7kDQuXv .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-okkxIkTiN7kDQuXv .doneText0,#mermaid-svg-okkxIkTiN7kDQuXv .doneText1,#mermaid-svg-okkxIkTiN7kDQuXv .doneText2,#mermaid-svg-okkxIkTiN7kDQuXv .doneText3{fill:#000 !important}#mermaid-svg-okkxIkTiN7kDQuXv .crit0,#mermaid-svg-okkxIkTiN7kDQuXv .crit1,#mermaid-svg-okkxIkTiN7kDQuXv .crit2,#mermaid-svg-okkxIkTiN7kDQuXv .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-okkxIkTiN7kDQuXv .activeCrit0,#mermaid-svg-okkxIkTiN7kDQuXv .activeCrit1,#mermaid-svg-okkxIkTiN7kDQuXv .activeCrit2,#mermaid-svg-okkxIkTiN7kDQuXv .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-okkxIkTiN7kDQuXv .doneCrit0,#mermaid-svg-okkxIkTiN7kDQuXv .doneCrit1,#mermaid-svg-okkxIkTiN7kDQuXv .doneCrit2,#mermaid-svg-okkxIkTiN7kDQuXv .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-okkxIkTiN7kDQuXv .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-okkxIkTiN7kDQuXv .milestoneText{font-style:italic}#mermaid-svg-okkxIkTiN7kDQuXv .doneCritText0,#mermaid-svg-okkxIkTiN7kDQuXv .doneCritText1,#mermaid-svg-okkxIkTiN7kDQuXv .doneCritText2,#mermaid-svg-okkxIkTiN7kDQuXv .doneCritText3{fill:#000 !important}#mermaid-svg-okkxIkTiN7kDQuXv .activeCritText0,#mermaid-svg-okkxIkTiN7kDQuXv .activeCritText1,#mermaid-svg-okkxIkTiN7kDQuXv .activeCritText2,#mermaid-svg-okkxIkTiN7kDQuXv .activeCritText3{fill:#000 !important}#mermaid-svg-okkxIkTiN7kDQuXv .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-okkxIkTiN7kDQuXv g.classGroup text .title{font-weight:bolder}#mermaid-svg-okkxIkTiN7kDQuXv g.clickable{cursor:pointer}#mermaid-svg-okkxIkTiN7kDQuXv g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-okkxIkTiN7kDQuXv g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-okkxIkTiN7kDQuXv .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-okkxIkTiN7kDQuXv .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-okkxIkTiN7kDQuXv .dashed-line{stroke-dasharray:3}#mermaid-svg-okkxIkTiN7kDQuXv #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv .commit-id,#mermaid-svg-okkxIkTiN7kDQuXv .commit-msg,#mermaid-svg-okkxIkTiN7kDQuXv .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-okkxIkTiN7kDQuXv g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-okkxIkTiN7kDQuXv g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-okkxIkTiN7kDQuXv g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-okkxIkTiN7kDQuXv .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-okkxIkTiN7kDQuXv .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-okkxIkTiN7kDQuXv .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-okkxIkTiN7kDQuXv .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-okkxIkTiN7kDQuXv .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-okkxIkTiN7kDQuXv .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-okkxIkTiN7kDQuXv .edgeLabel text{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-okkxIkTiN7kDQuXv .node circle.state-start{fill:black;stroke:black}#mermaid-svg-okkxIkTiN7kDQuXv .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-okkxIkTiN7kDQuXv #statediagram-barbEnd{fill:#9370db}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-state .divider{stroke:#9370db}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-okkxIkTiN7kDQuXv .note-edge{stroke-dasharray:5}#mermaid-svg-okkxIkTiN7kDQuXv .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-okkxIkTiN7kDQuXv .error-icon{fill:#522}#mermaid-svg-okkxIkTiN7kDQuXv .error-text{fill:#522;stroke:#522}#mermaid-svg-okkxIkTiN7kDQuXv .edge-thickness-normal{stroke-width:2px}#mermaid-svg-okkxIkTiN7kDQuXv .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-okkxIkTiN7kDQuXv .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-okkxIkTiN7kDQuXv .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-okkxIkTiN7kDQuXv .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-okkxIkTiN7kDQuXv .marker{fill:#333}#mermaid-svg-okkxIkTiN7kDQuXv .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;} #mermaid-svg-okkxIkTiN7kDQuXv {color: rgba(0, 0, 0, 0.75);font: ;}

a
b
c

a走到b,发现b不能走了,回退到a,a走到c,c走到b。
c能走到b的原因就是回溯了,原本第一次走的时候,已经走过了b点,b点已经被标记走过了,但是回溯了,把b点标记成没走过了,所以c才能走到b。
如果直接a到b,不回溯,回退到a点的时候,b点的标记是走过的,则c不能到d;

小结:回溯更类似于悔棋功能,相当于重来了;不回溯则相当于往回走,这个点实际还是走过的;

/**
* x,y就是相应的横纵坐标
* step就是表示现在是第几步了
**/
void dfs(int x, int y, int step)
{map[x][y] = step;//将step的值赋给map中(x,y)坐标里//截止条件,如果走到了第64步,就说明把棋盘走遍了,结束函数if (step == 64){//将棋盘打印出来printMap();      //这是个自定义的函数printf("\n\n");return;}vis[x][y] = 1;     //将此点标记为已经走过for (int i = 0; i < 8; i++){int tx = dir[i][0] + x;int ty = dir[i][1] + y;if (in(tx, ty) && !vis[tx][ty]){//如果(tx,ty)在棋盘里面且没走过,则对它进行下一步的判断//意思就是直接走(tx,ty)这个点,到了这个点之后,再展开一次搜索dfs(tx, ty, step + 1);}}//回溯vis[x][y] = 0;map[x][y] = 0;
}

2.代码预览

#define _CRT_SECURE_NO_WARNINGS      //防止scanf_s报错
#include<stdio.h>int map[10][10]; //棋盘
int dir[8][2] = {{1,2} ,{-1,2},{1,-2},{-1,-2},{2,1},{2,-1},{-2,1},{-2,-1}
};
int vis[10][10];    //判断该点是否已走
bool f;             //判断是否已经找到答案
bool only = false; //如果需要输出多个答案,就把only改成false;反之为true//打印棋盘
void printMap()
{for (int i = 0; i < 8; i++){for (int j = 0; j < 8; j++){printf("%4d", map[i][j]);}printf("\n\n");}return;
}bool in(int x, int y)  //判断(x,y)是否在棋盘内
{return x >= 0 && x < 8 && y >= 0 && y < 8;
}/**
* x,y就是相应的横纵坐标
* step就是表示现在是第几步了
**/
void dfs(int x, int y, int step)
{if (f && only) return;map[x][y] = step;//将step的值赋给map中(x,y)坐标里//截止条件,如果走到了第64步,就说明把棋盘走遍了,结束函数if (step == 64){//将棋盘打印出来printMap();        //这是个自定义的函数printf("\n\n");f = true;return;}vis[x][y] = 1;       //将此点标记为已经走过for (int i = 0; i < 8; i++){int tx = dir[i][0] + x;int ty = dir[i][1] + y;if (in(tx, ty) && !vis[tx][ty]){//如果(tx,ty)在棋盘里面且没走过,则对它进行下一步的判断//意思就是直接走(tx,ty)这个点,到了这个点之后,再展开一次搜索dfs(tx, ty, step + 1);}}//回溯vis[x][y] = 0;map[x][y] = 0;
}void run()
{int x, y;printf("请输入起始位置:");scanf("%d%d", &x, &y);if (!in(x, y))    //如果(x,y)不在棋盘里,返回真{printf("\n\nERROR:起始位置输入有误!!!\n\n");return;}printf("\n\n");dfs(x, y, 1);
}int main()
{run();return 0;
}

四、dfs+贪心算法

1.贪心策略

正常情况,走下一步是按dir数组顺序,一个一个找可以移动的位置,然后移动,这样移动和随机区别不大。

而本题的贪心策略就是:选择后续节点最少的那一个位置移动,哪一个点的下一步少,就选哪个点

例如:A可以走到B,C,D。B可以移动的位置有5个,C可以移动的位置有2个,D可移动的位置有6个。那A就是选后续节点最少的位置移动,也就是移动到C点。

2.贪心原理

一个点的后续点位越少,就越应该先选。 它的后续点位本来就少,如果不先选了,把后续点位给占了,那么之后该点后续点位被走过了的话,之后你再选该点,就很容易出现无路可走的情况,然后就只能回溯了。但回溯又十分影响效率,所以,为了减少回溯的情况,我们就先把那些之后容易发生回溯的点给先踩过了,这样回溯情况就少了。

举个栗子: A点可以走B,C位置,B有一个后续节点(到B之后能走的就一个方向了)。A走C,它的后续节点很多,但可能包含了B点的后续点位,如果它把B的后续节点给踩了,以后踩到B点了,那B点就无路可走了,就必须要回溯了

3.核心代码

//next数组的初始化值都是0
int next[8] = {0,0,0,0,0,0,0,0};
void getNext(int x, int y, int* next)   //获得后续点位数量的数组
{for (int i = 0; i < 8; i++){int tx = x + dir[i][0];int ty = y + dir[i][1];if (in(tx, ty)) //这里其实也有 && !vis[tx][ty]的,不过把&& !vis[tx][ty]写到了in数据里面{for (int j = 0; j < 8; j++){int ttx = tx + dir[j][0];     int tty = ty + dir[j][1];     if (in(ttx, tty)){next[i]++;  //统计每个移动方向后续点位个数}}}}
}

之后我们就要让后续节点更少的先走,所以我们可以进行排序操作

//获得next数组从小到大的,但是值是次序
//比如:next[8] = {3,2,5,1,1,0,1,0};
//那么seq数组就是 {5,7,3,4,6,1,0,2}
//第一个是5,是因为next[5] = 0,第二个是7,是因为next[7] = 0;以此类推
int seq[8] = {0,1,2,3,4,5,6,7};
void getSeq(int* next, int* seq)
{int n[8];for (int i = 0; i < 8; i++)n[i] = next[i];//防止原本的next数组被排序,复制个next数组来排序就可//冒泡排序,不过捆绑了Seq数组,当然,这里也可以用结构体实现for (int i = 0; i < 7; i++){for (int j = 0; j < 7 - i; j++){if (n[j] > n[j + 1]){int t = n[j];n[j] = n[j + 1];n[j + 1] = t;//n数组交换时,让seq数组进行同样的交换t = seq[j];seq[j] = seq[j + 1];seq[j + 1] = t;}}}
}

4.代码预览

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>#define ROW 8
#define COL 8bool only = true;         //only为true表示只输出一种结果,反之多种
bool f = false;                //判断是否已经找到答案
int map[ROW + 5][COL + 5];    //棋盘
int vis[ROW + 5][COL + 5];    //标记该位置是否已经落子int dir[8][2] = { {-1,2},{-1,-2}, {1,-2}, {1,2}, {-2,1},{2,-1}, {-2,-1}, {2,1} };bool in(int x, int y)    //在棋盘里,且该位置没棋子
{return x >= 0 && x < ROW&& y >= 0 && y < COL && !vis[x][y];
}
//需要注意的是,这里的in函数里面整合了 !vis[x][y] void printMap()     //打印棋盘
{for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){printf("%4d", map[i][j]);}printf("\n\n");}printf("\n\n");
}void printArray(int* num, int size, const char* str)   //打印数组,用于调试
{printf("%5s:", str);for (int i = 0; i < size; i++){printf("%4d", num[i]);}printf("\n\n");
}//next数组的初始化值都是0
void getNext(int x, int y, int* next)   //获得后续点位数量的数组
{for (int i = 0; i < 8; i++){int tx = x + dir[i][0];int ty = y + dir[i][1];if (in(tx, ty)){for (int j = 0; j < 8; j++){int ttx = tx + dir[j][0];      int tty = ty + dir[j][1];     if (in(ttx, tty)){next[i]++;  //统计每个移动方向后续点位个数}}}}
}//获得next数组从小到大的,但是值是次序
//比如:next[8] = {3,2,5,1,1,0,1,0};
//那么seq数组就是 {5,7,3,4,6,1,0,2}
//第一个是5,是因为next[5] = 0,第二个是7,是因为next[7] = 0;以此类推
void getSeq(int* next, int* seq)
{int n[8];for (int i = 0; i < 8; i++)n[i] = next[i];//防止原本的next数组被排序,复制个next数组来排序就可//冒泡排序,不过捆绑了Seq数组,当然,这里也可以用结构体实现for (int i = 0; i < 7; i++){for (int j = 0; j < 7 - i; j++){if (n[j] > n[j + 1]){int t = n[j];n[j] = n[j + 1];n[j + 1] = t;//n数组交换时,让seq数组进行同样的交换t = seq[j];seq[j] = seq[j + 1];seq[j + 1] = t;}}}
}void dfs(int x, int y, int step)
{if (f && only){return;}map[x][y] = step;if (step == 64){//输出printMap();f = true;return;}vis[x][y] = 1;//标记//这里进行深度优先搜索,采取贪心策略进行减枝优化int next[8] = { 0,0,0,0,0,0,0,0 };getNext(x, y, next);int seq[8] = { 0,1,2,3,4,5,6,7 };getSeq(next, seq);//原本dfs是随机的找的,现在,通过贪心得到了一个seq数组,就是搜索顺序的数组//开始搜索for (int i = 0; i < 8; i++){int tx = x + dir[seq[i]][0];int ty = y + dir[seq[i]][1];if (in(tx, ty))dfs(tx, ty, step + 1);}//回溯vis[x][y] = 0;map[x][y] = 0;
}void run()
{int x, y;printf("请输入起始坐标:");scanf("%d%d", &x, &y);if (!in(x, y)){printf("\n\n坐标输入错误!!!!\n\n");return;}printf("\n\n");dfs(x, y, 1);
}int main()
{run();return 0;
}

五、栈+贪心

1.回溯方法

之前写的代码都是用过递归来进行回溯的,现在将用栈来进行回溯。

2.基本操作

//定义栈的结构体
typedef struct
{int x;int y;int dir;   //方向
}Stack;Stack chess[ROW * COL + 5];     //存储每步的棋子位置
int top = -1;                  //栈顶指针
int out_stack = 0;             //出栈次数//入栈的时候会进行初始化
void push(int x, int y)
{top++;chess[top].x = x;chess[top].y = y;chess[top].dir = DIR;map[x][y] = top + 1;//因为top是从负一开始的,而第一步是1
}//出栈,要把栈顶数据给初始化,然后再top--;
void pop()
{map[chess[top].x][chess[top].y] = 0;chess[top].x = 0;chess[top].y = 0;chess[top].dir = DIR;top--;
}

3.核心代码

void dfs()
{while (1){if (top >= 64 - 1)       //top从0开始,【64】,最大就是63,共有64个{//打印棋盘printMap();break;}int x = chess[top].x;int y = chess[top].y;int next[8] = { 0,0,0,0,0,0,0,0 };getNext(x, y, next);int seq[8] = { 0,1,2,3,4,5,6,7 };getSeq(next, seq);bool flag = false;//用来标记是否进栈for (int i = chess[top].dir + 1; i < 8; i++)    {   //i = chess[top].dir+1 是因为要先偏移一位,才能判断其他数据,不然当需要回溯时,先出栈,//然后再到这个位置的时候,i还是等于之前那个需要回溯的dir,然后就成死循环了int tx = x + dir[seq[i]][0];int ty = y + dir[seq[i]][1];chess[top].dir++;if (in(tx, ty)){push(tx, ty);flag = true;break;}}//如果前面8个方向已经判断完,且没有进栈,就说明目前没有方向可以走了,只能出栈//这个dir方向中,只有输入7 5 才会发生回溯if (chess[top].dir == 7 && flag == false){out_stack++;pop();}}
}

4.代码预览

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>#define ROW 8
#define COL 8
#define DIR -1      //方向默认为-1,-1表示不能走int dir[8][2] = { {2,-1},{-2,-1},{-2,1},{2,1},{1,-2},{-1,-2},{-1,2},{1,2} };
int map[ROW][COL];//定义栈的结构体
typedef struct
{int x;int y;int dir;   //方向
}Stack;Stack chess[ROW * COL + 5];     //存储每步的棋子位置
int top = -1;                  //栈顶指针
int out_stack = 0;             //出栈次数bool in(int x, int y)
{return x >= 0 && x < ROW && y >= 0 && y < COL && !map[x][y];
}
//注意这里整合了  !map[x][y]void printMap()        //打印棋盘
{printf("\n\n");for (int i = 0; i < ROW; i++){for (int j = 0; j < COL; j++){printf("%4d", map[i][j]);}printf("\n\n");}printf("\n\n");
}
void getNext(int x, int y, int* next)
{for (int i = 0; i < 8; i++){int tx = x + dir[i][0];int ty = y + dir[i][1];if (in(tx, ty)){for (int j = 0; j < 8; j++){int ttx = tx + dir[j][0];      int tty = ty + dir[j][1];     if (in(ttx, tty)){next[i]++;}}}}
}void getSeq(int* next, int* seq)
{int n[8];for (int i = 0; i < 8; i++)n[i] = next[i];//防止原本的next数组被排序,复制个next数组来排序就可//冒泡排序,不过捆绑了Seq数组,当然,这里也可以用结构体实现for (int i = 0; i < 7; i++){for (int j = 0; j < 7 - i; j++){if (n[j] > n[j + 1]){int t = n[j];n[j] = n[j + 1];n[j + 1] = t;//n数组交换时,让seq数组进行同样的交换t = seq[j];seq[j] = seq[j + 1];seq[j + 1] = t;}}}
}//入栈的时候会进行初始化
void push(int x, int y)
{top++;chess[top].x = x;chess[top].y = y;chess[top].dir = DIR;map[x][y] = top + 1;//因为top是从负一开始的,而第一步是1
}//出栈,要把栈顶数据给初始化,然后再top--;
void pop()
{map[chess[top].x][chess[top].y] = 0;chess[top].x = 0;chess[top].y = 0;chess[top].dir = DIR;top--;
}void dfs()
{while (1){if (top >= 64 - 1)       //top从0开始,【64】,最大就是63,共有64个{//打印棋盘printMap();break;}int x = chess[top].x;int y = chess[top].y;int next[8] = { 0,0,0,0,0,0,0,0 };getNext(x, y, next);int seq[8] = { 0,1,2,3,4,5,6,7 };getSeq(next, seq);bool flag = false;//用来标记是否进栈for (int i = chess[top].dir + 1; i < 8; i++)    {   //i = chess[top].dir+1 是因为要先偏移一位,才能判断其他数据,不然当需要回溯时,先出栈,//然后再到这个位置的时候,i还是等于之前那个需要回溯的dir,然后就成死循环了int tx = x + dir[seq[i]][0];int ty = y + dir[seq[i]][1];chess[top].dir++;if (in(tx, ty)){push(tx, ty);flag = true;break;}}//如果前面8个方向已经判断完,且没有进栈,就说明目前没有方向可以走了,只能出栈//这个dir方向中,只有输入7 5 才会发生回溯if (chess[top].dir == 7 && flag == false){out_stack++;pop();}}
}void run()
{int x, y;printf("请输入起始坐标:");scanf("%d%d", &x, &y);if (!in(x, y)){printf("\n\n坐标输入错误!!\n\n");return;}push(x, y);dfs();printf("\n\n共回溯%d次\n\n", out_stack);
}int main()
{run();return 0;
}

总结

马踏棋盘问题可以用搜索的方法解决,搜索的过程中可以通过栈或递归的方式进行回溯;普通的暴力搜索,其实就是穷举法,如果把所有可能都一一列举出来,则需要运算接近8 的64 次方 次,所以,需要优化,而这里是使用贪心的方式进行剪枝优化,将之后可能会发生回溯的点位先踩,减少回溯的情况发生。

马踏棋盘-数据结构 详细教程相关推荐

  1. 基于Java Swing 的马踏棋盘小游戏(附源码!免费下载!)

    马踏棋盘游戏小项目 设计主要功能 运用的数据结构 运行流程讲解及录像 项目分类截图及源码链接! 设计主要功能 (1)设计内容:设计一个马踏棋盘游戏,马作为棋子,以马走日字的走法,将整个棋盘一次性走完, ...

  2. 数据结构——马踏棋盘题解(贪心算法)

    本文转自: https://blog.csdn.net/qq_41596568/article/details/83060317 数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值 ...

  3. 数据结构与算法|马踏棋盘算法(小甲鱼)C语言代码的算法分析

    马踏棋盘算法(骑士周游问题)的算法分析 C语言代码部分来自小甲鱼的<数据结构与算法> 文章目录 马踏棋盘算法(骑士周游问题)的算法分析 一.C语言代码实现 二.代码分析与算法思路 题目要求 ...

  4. 数据结构——马踏棋盘题解(贪心算法)(C语言)

    数据结构--马踏棋盘题解(贪心算法) 使用循环建立棋盘与权值棋盘(权值为该位置可走的位置数量) 将当前步数写入棋盘数组中 开始探测下一步该走的位置, 分别测试八个方向 对可走位置进行查询权值,将权值最 ...

  5. c语言数据结构之马踏棋盘

    c语言数据结构之马踏棋盘 马踏棋盘游戏 (一)思路: 马随机放在国际象棋的 8×8 棋盘 Board[07][07]的某个方格中,马按走棋规则进行移动.要求每个方格只进入一次,走遍棋盘上全部 64 个 ...

  6. 【算法篇】/*一篇博客带你详细了解马踏棋盘问题*/(java语言实现)

    [前言]本文部分内容引用于b站尚硅谷老师的资料,如有侵权,请及时联系作者! hello大家好! 我依然是你们熟悉的槿凉.那么最近呢由于躺平了几天,也没有来得及更新博客,没有办法啦!学校封的严严实实,闷 ...

  7. Day600601.马踏棋盘算法 -数据结构和算法Java

    马踏棋盘算法 图的深度优先DFS 回溯 八皇后问题.小老鼠找迷宫问题 一.介绍 二.思路分析 三.代码实现 package com.achang.algorithm;import java.awt.* ...

  8. 数据结构(七)——Dijkasta 、Flyod、马踏棋盘算法

    Dijkstra 算法 应用场景-最短路径问题 有 7 个村庄(A, B, C, D, E, F, G) ,现在有六个邮差,从 G 点出发,需要分别把邮件分别送到A, B, C , D, E, F 六 ...

  9. 【数据结构与算法】马踏棋盘(骑士周游世界)算法

    一,基本介绍 1)马踏棋盘算法也称为骑士周游问题 2)将马随机放在国际象棋的8 × 8棋盘Board[0~7] [0~7]的某个方格中,马按走棋规则(马走日字)进行移动.要求每个方格只进入一次,走遍棋 ...

最新文章

  1. 苹果回应“远程扫描用户相册”:声明被广泛误解,未设后门,功能仅美国可用...
  2. MLP 之手写数字识别
  3. leetcode 216. Combination Sum III | 216. 组合总和 III(Java)
  4. ADAS(1) 概述整理及自动驾驶实例
  5. python热键+鼠标键盘控制
  6. C++_const修饰指针_指针和数组_指针和函数_指针配合数组和函数案例_用指针数组实现冒泡排序---C++语言工作笔记024
  7. 依赖反转原则(DIP)
  8. 《算法设计与分析基础》第2版
  9. MATLAB神经网络应用之Elman神经网络
  10. CSS布局控制--盒子模型
  11. word怎么把页面顺序倒过来_怎么把word顺序颠倒
  12. pythonturtle作品编程技巧说明_在Python教学中应用turtle创意编程实践
  13. Scala快速入门(适用于学习Spark)
  14. rsyslog+elk 网络设备日志收集及钉钉报警
  15. 重新认识 D 编程语言 —— 基础篇
  16. 毕业设计周报(第六周)
  17. 加强生物保护 绿日同学公益组织“国际生物多样性日“宣传活动
  18. 实战:第六章:H5微信与支付宝调试错误,请回到请求来源地,重新发起请求。 错误代码 insufficient-isv-permissions
  19. 第95篇 ES之安装Elastica及总结安装Elastica
  20. 基于cv2的图片处理之轮廓、截图(一)

热门文章

  1. hofstede六个维度指数指标_这个指数这么火!到底应该买哪只场外基金参与?
  2. 使用geoserver发布超大TIF文件过程记录--FWTools工具切片
  3. 计算机系统应用可以供一作吗,自考管理系统中计算机应用最新版本复习资料大大全9614(2014年版本)...
  4. 最新WordPress系统文章自动采集插件Auto Post完美运行版
  5. html div box,CSS box-sizing属性的正确用法
  6. 调用RTMP_SendPacket经常会出现阻塞现象
  7. 十二月英语——Thinking out loud
  8. 苹果cms php获取id,【PHP】苹果cms 8.0天蓝色苹果cms模板 一键采集+会员收费系统
  9. CSS实现10px字体
  10. 教你怎么用Python和Qt5编写中国象棋AI版——简明易懂版