马踏棋盘
问题描述和要求
一只马在棋盘的某一点,它可以朝8个方向前进,方向向量分别是:(2,1)、(2,-1)、(1,2)、(1,-2)、(-2,1)、(-2,-1)、(-1,2)、(-1,-2),从中任选择一个方向前进,到达新的位置。再从新的位置选择一个方向前进,继续,直到无法前进为止。无法前进可能有如下原因:下一位置超出边界、下一位置已经被访问过。当马已经无法前进时,就回退到上一位置,从新选择一个新的方向前进;如果还是无法前进,再回退到上一位置……。
算法
回溯算法:实际上一个类似枚举的搜索尝试过程,主要在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。许多复杂的,规模较大的问题都可以使用回溯法。
流程图
运行结果
动态显示马踏棋盘全过程
实现代码
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int content=0;
int p=8,q=8;
int w[8][8]={
0};
int max_v=0;
void put(int i,int j);
void print();
void sck();
int main()
{
int i=0,j=0;
put(i,j);
int a=0;
for(int i=0;i<p;i++)
{
for(int j=0;j<q;j++)
{
if(a<w[i][j])
a=w[i][j];
}
}
sck();
print();
printf(